动态分配数组的新初学者.为什么我在这里有分段错误?



我对斐波那契使用嵌套数据结构,但我有一个分割错误 11。

void fib(int **fib_array, int n){
fib_array = malloc(n * sizeof(int*));
for(int i = 0; i < n; i++){
fib_array[i] = malloc(sizeof(int));
}
for(int i = 0; i < n; i++){
if (i <= 1){
fib_array[i][0] = i;
}
else{
fib_array[i][0] = fib_array[i - 2][0] + fib_array[i - 1][0]; 
}
}
}

int main(int argc, char **argv) {
/* do not change this main function */
int count = strtol(argv[1], NULL, 10);
int *fib_sequence;
fib(&fib_sequence, count);
for (int i = 0; i < count; i++) {
printf("%d ", fib_sequence[i]);
}
free(fib_sequence);
return 0;
}

你太复杂了。你只需要一个马洛克

*fib_array = malloc(n * sizeof(int));

并从任何地方删除[0]的第二个索引

融合来自**int.这看起来像一个多暗阵列。它不是 - 它声明**以便您可以在调用方中设置值。更简单的考试会有所帮助

void Make42(int* v)
{
*v = 42;
}
int main()
{
int myv = 0;
Make42(&myv);
// now myv == 42
}

arg 列表中的*是为了让 Make42 可以"伸出援手"并修改传递给它的内容(在本例中为 myv)

在您的代码中,fib 数组上的**用于相同的目的。 你可以做到(知道测试定义不允许你这样做)

int *fib(int n){
int *fib_array = malloc(n * sizeof(int));
......
return fib_array;
}

和在主要

fib_sequence = fib(count);

这使得你真正在操作一个简单的数组变得更加清晰。

> pm100 是对的,但对于初学者来说有点短......

首先,您传递了一个指向指针的指针。如果希望原始指针包含值,则需要取消对指针的指针的引用:

*fib_array = ...

通过仅分配给指针(就像在代码中所做的那样),您根本不会修改原始指针(在 main 中fib_sequence)。由于您尚未初始化它,因此当您尝试打印其值时,它可能会指向任何地方,因此当您尝试打印其值时会出现分段错误。

那么为什么要使用指向单独存储值的指针数组呢?您可以使用连续的int数组,您可以通过

*fib_array = malloc(n * sizeof(int));

好的,进一步的使用不会太好((*fib_array)[i] = ...),所以我推荐一个临时变量:

int* fa = malloc(n * sizeof(int));
// now fill in the values comfortably:
fa[i] = ...;
// finally, assign the pointer to the target:
*fib_array = fa;

旁注:始终检查malloc的结果,可能会NULL

fa = ...
if(fa)
// assign values
else
// appropriate error handling

在您的具体情况下,您可以省略函数中的 else 分支,并在 main 函数中检查外部的指针。

顺便说一下,一个简单的返回值也会让你的生活更轻松:

int* fib(int n)
{
int* fib_array = malloc(n * sizeof(int*));
// ...
return fib_array;
}

注意:不需要指针指向指针...用法:

int* fib_sequence = fib(count);

最新更新