I have a class named "Coordinate" which consist of an int array pointer and a bool variable. I want to send this pointer into CUDA, modify it and then use it back in CPU memory.
Here is Coordinate.h :
#ifndef __COORDINATE_H
#define __COORDINATE_H
#include <stdlib.h>
#include <cuda.h>
using namespace std;
class Coordinate {
public:
    int *array_pointer;
    bool flag;
    Coordinate() { flag = false; }
    Coordinate(int array_length) {
        flag = false;
        array_pointer = new int[array_length];
        for (int i = 0; i < array_length; i++) {
            array_pointer[i] = -1;
        }
    }
};
#endif
I have made 2 global functions in cudamain.cu Check1 and Check2, both will take a Coordinate as argument. Check1 function will change only boolean flag which Check2 will change boolean flag and also modify the array.
Here is cudamain.cu :
#include <iostream>
#include <cuda.h>
#include "Coordinate.h"
using namespace std;
__global__ void check1(Coordinate *ptr) {
    c->flag = true;
}
__global__ void check2(Coordinate *c) {
    c->flag = true;
    for (int i = 0; i < 10; i++) {
        c->array_pointer[i] = i;
    }
}
int main() {
    Coordinate *d_a, *d_b, a, b;
    a = Coordinate(10); b = Coordinate(10);
    size_t size = sizeof(Coordinate);
    cudaMalloc((void**)&d_a, size); cudaMalloc((void**)&d_b, size);
    cudaMemcpy(d_a, &a, size, cudaMemcpyHostToDevice); cudaMemcpy(d_b, &b, size, cudaMemcpyHostToDevice);
    check1 << <1, 1 >> > (d_a);
    cudaMemcpy(&a, d_a, size, cudaMemcpyDeviceToHost);
    cout <<"d_a result-> " <<a.flag <<" " <<a.array_pointer[9] << endl;
    check2 << <1, 1 >> > (d_b);
    cudaMemcpy(&b, d_b, size, cudaMemcpyDeviceToHost);
    cout << "d_b result-> " << b.flag << " " << b.array_pointer[9] << endl;
    return 0;
}
I made 2 separate coordinate objects a and b, a will go with check1 and b will go with check2. Both a and b are initialized in same way.
The result I get is
d_a result-> 1 -1
d_b result-> 0 -1
Expected result:
d_a result-> 1 -1
d_b result-> 1 9
Different Coordinate objects may have different array length so I can't initialize the array pointer in the coordinate class.
 
    