对不起,我今天花了大部分时间试图解决什么可能是一个简单的指针问题,想知道是否有人可以帮助。
我想要一个函数,它向main()返回一个数字和一个数组,因此需要对其中至少一个使用指针。数组必须在函数内部动态分配。
我已经在下面以简化的形式展示了我最好的尝试。我只得到"分割错误"。
double my_func(double **ptr);
int main(int argc, char **argv){
double value;
double *a;
value = my_func(&a);
printf("Value is %f array[1] is %f n", value, a[1]);
return 0;
}
double my_func(double **ptr){
int i;
/* generate an array */
void *memory = malloc(10*sizeof(double));
if (memory == NULL){
printf("ERROR: out of memoryn");
}
*ptr = (double *) memory;
/* Fill the array with some values */
for (i=0;i<10;i++)
{
**(ptr+i) = 42;
}
return 3.14;
}
[这样做的原因是我有一个读取文件的函数,我想将行数和包含文件内容的数组返回给main()。我希望它能动态地分配数组,这样程序就可以对任何大小的文件进行操作。[/p>
谢谢你的帮助!
下一行您将i添加到变量a的地址:
**(ptr+i) = 42;
要将i添加到错位地址中,需要先对ptr解引用:
*(*ptr+i) = 42;
除了@ygram的答案,我发现通过使用辅助变量
有助于简化分配函数(示例中的my_func
)中的事情:double myfunc(double **a_dp) {
int i;
double *dp;
dp = malloc(10 * sizeof *dp);
/* no cast required for malloc in C, but make sure you #include <stdlib.h> */
if (dp == NULL) {
... handle error ...
}
*a_dp = dp;
for (i = 0; i < 10; i++)
dp[i] = 42;
return 3.14;
}
也就是说,不必重复写*(*ptr + index)
或(*ptr)[index]
,而是创建一个局部变量来保存您也将存储到*ptr
中的值-这里我将该局部变量称为dp
-然后您只需在本地使用dp
,除了(一个或有时几个)必须存储值以便调用者接收它的地方。
数组和数字之间是什么关系?为了简单起见,把它们放在一个结构体中不是更好吗?把这里的东西清理干净真的会很有帮助。
typedef struct ArrayStruct {
double num;
long len; // ideal place to store the array length for future bounds checking!
double *array;
} ArrayStruct;
int main(int argc, char **argv) {
ArrayStruct myArray = {0};
myFunc(&myArray);
printf("Value is %f array[1] is %f n", myArray.num, myArray.array[1]);
free(myArray.array);
return 0;
}
void myFunc(ArrayStruct *s) {
// Do whatever you like with the struct:
s->len = 10;
s->array = (double *)malloc(s->len * sizeof(double));
for (int i=0; i< s->len; i++)
s->array[1] = 42;
s->num = 3.14;
}
这样做意味着你不需要担心返回任何东西或弄乱指针,只需在main中声明结构体,将引用传递给myFunc()
或任何你想使用它的地方,然后更改数据,因为你认为合适。
抱歉,如果有任何错误在代码中,只是键入它很快,但它应该说明这一点,无论如何!