我想要一个向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 memory\n");
}
*ptr = (double *) memory;
/* Fill the array with some values */
for (i=0;i<10;i++)
{
**(ptr+i) = 42;
}
return 3.14;
}
[原因是我有一个读取文件的函数,我想将行数和包含文件内容的数组返回给main()。我希望它动态分配数组,这样程序就可以运行任何大小的文件。]
感谢您的帮助!
答案 0 :(得分:2)
以下行是您将i添加到变量a:
的地址**(ptr+i) = 42;
要将i添加到malloced地址,您需要先取消引用ptr:
*(*ptr+i) = 42;
答案 1 :(得分:0)
除了@ 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
,但必须存储值的(一个或有时几个)地方除外,以便调用者接收它。
答案 2 :(得分:0)
数组和数字之间有什么关系?为了简单起见,将它们放在一个结构中并不是更好,这将有助于在这里清理它们。
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中声明struct,传递对myFunc()
的引用或者你想要使用它的任何地方,然后改变你认为合适的数据。
很抱歉,如果该代码有任何错误,只需快速输入,但它应该说明这一点!