Reputation: 4642
I'm trying to call a function written in C which passes in a pointer to an array.
In C++ I have the following:
double* x = new double[10];
populateArray(x);
In C:
void populateArray(double* vars);
{
vars = (double*) malloc(10*sizeof(double));
int i;
for(i = 0; (i < 10); i++)
{
vars[i] = 1*20;
}
}
However, when I try to output the contents of x
inside the C++ code, the result is always 0?
Upvotes: 0
Views: 106
Reputation: 5369
Problem arises because you are changing local variable vars
.
Change to:
double* x; //you don't need to allocate here if you are allocating later
populateArray(&x);
And:
void populateArray(double** vars)
{
*vars = malloc(10*sizeof(double)); //also no need to cast malloc
int i;
for(i = 0; (i < 10); i++)
{
(*vars)[i] = 1*20;
}
}
Upvotes: 4
Reputation: 10867
Short answer: Remove the malloc
call inside the function.
Slightly longer answer:
You're changing the value of the vals
pointer to another newly allocated memory -- thus, the argument you pass in gets unused (and thus is never populated).
The result being always 0 is a coincidence, it could be anything (or you could end up with nasal demons) because you're then reading uninitialized memory, which is undefined behavior.
This of it as this, if you remove the call:
vals = new double[10];
vals = malloc(10 * sizeof(double));
The first value is overwritten.
Upvotes: 0
Reputation: 39827
void populateArray(double* vars);
{
vars = (double*) malloc(10*sizeof(double)); // <---- remove this line completely
The problem is you're ignoring the vars
you were given and creating a brand new buffer for it.
Worse, that buffer pointer gets lost when this function returns, causing a memory leak.
Just use the vars
you were given -- delete the line indicated above.
Upvotes: 0