我对斐波那契使用嵌套数据结构,但我有一个分割错误 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);