C++ C++;将对数组的引用传递给C函数
我试图调用一个用C编写的函数,该函数传入一个指向数组的指针 在C++中,我有以下的内容:C++ C++;将对数组的引用传递给C函数,c++,c,arrays,pointers,C++,C,Arrays,Pointers,我试图调用一个用C编写的函数,该函数传入一个指向数组的指针 在C++中,我有以下的内容: double* x = new double[10]; populateArray(x); 在C中: void populateArray(双*vars); { vars=(双*)malloc(10*sizeof(双)); int i; 对于(i=0;(i 无效的Puto AtAR(双*VARS); void populateArray(double* vars); { vars = (dou
double* x = new double[10];
populateArray(x);
在C中:
void populateArray(双*vars);
{
vars=(双*)malloc(10*sizeof(双));
int i;
对于(i=0;(i<10);i++)
{
变量[i]=1*20;
}
}
<>但是,当我尝试在C++代码中输出<代码> x <代码>的内容时,结果总是为0?< /p> <代码>无效的Puto AtAR(双*VARS);
void populateArray(double* vars);
{
vars = (double*) malloc(10*sizeof(double)); // <---- remove this line completely
{
vars=(双*)malloc(10*sizeof(双));//void populateArray(双*vars);
{
vars=(double*)malloc(10*sizeof(double));//简短回答:删除函数内部的malloc
调用
稍长一点的回答:
您正在更改指向另一个新分配内存的vals
指针的值——因此,传入的参数未使用(因此永远不会填充)
结果总是0是一种巧合,它可能是任何东西(或者你可能最终得到),因为你正在读取未初始化的内存,这是一种未定义的行为
如果您取消呼叫,请将其更改为:
vals = new double[10];
vals = malloc(10 * sizeof(double));
第一个值被覆盖。简短回答:删除函数中的malloc
调用
稍长一点的回答:
您正在更改指向另一个新分配内存的vals
指针的值——因此,传入的参数未使用(因此永远不会填充)
结果总是0是一种巧合,它可能是任何东西(或者你可能最终得到),因为你正在读取未初始化的内存,这是一种未定义的行为
如果您取消呼叫,请将其更改为:
vals = new double[10];
vals = malloc(10 * sizeof(double));
第一个值被覆盖。问题的出现是因为您正在更改局部变量vars
改为:
double* x; //you don't need to allocate here if you are allocating later
populateArray(&x);
以及:
void populateArray(双**vars)
{
*vars=malloc(10*sizeof(double));//也不需要强制转换malloc
int i;
对于(i=0;(i<10);i++)
{
(*变量)[i]=1*20;
}
}
问题的出现是因为您正在更改局部变量vars
改为:
double* x; //you don't need to allocate here if you are allocating later
populateArray(&x);
以及:
void populateArray(双**vars)
{
*vars=malloc(10*sizeof(double));//也不需要强制转换malloc
int i;
对于(i=0;(i<10);i++)
{
(*变量)[i]=1*20;
}
}
调用时无需使用new
。无需为函数副本分配内存(更不用说不释放它了)当克里斯不使用<代码> < <代码> >时,我会得到一个分段错误。那么,你可能做的不对。这个函数对你所传递的内容没有任何作用。注意,这里没有传递一个引用,而是一个指针。这是很重要的,因为C没有通过引用,但是C++确实如此。调用时无需使用new
。无需为函数副本分配内存(更不用说不释放它了)当克里斯不使用<代码> < <代码> >时,我会得到一个分段错误。那么,你可能做的不对。这个函数对你所传递的内容没有任何作用。注意,这里没有传递一个引用,而是一个指针。这是很重要的,因为C没有通过引用,但是C++确实如此。请注意,此处的内存分配与其他答案中的内存分配不同。此答案中的函数获取不指向任何内容的指针的地址,并使其指向新的初始化数组。我的答案和其他答案中的函数获取已指向数组的指针,并初始化该空间中的值。或者方法可以解决您的问题,但能够区分这两种方法很好。请注意,此处的内存分配与其他答案中的内存分配方式不同。此答案中的函数获取指向零的指针的地址,并使其指向一个新的初始化数组。my和其他答案中的函数获取一个点呃,已经指向一个数组,并初始化该空间中的值。任何一种方法都可以解决您的问题,但是能够区分这两种方法是很好的。