C 动态分配数组的新手。为什么我在这里有分段错误?
我对斐波那契使用嵌套数据结构,但我有一个分段错误11C 动态分配数组的新手。为什么我在这里有分段错误?,c,C,我对斐波那契使用嵌套数据结构,但我有一个分段错误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){
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;
}
void fib(int**fib\u数组,int n){
fib_数组=malloc(n*sizeof(int*);
对于(int i=0;i 如果(i你太复杂了,你只需要一个malloc
*fib_array = malloc(n * sizeof(int));
然后从任何地方删除第二个索引[0]
consfusion来自**int
。这看起来像一个多维数组。它不是-它声明的**
,因此您可以在调用者中设置值。一个简单的示例将有所帮助
void Make42(int* v)
{
*v = 42;
}
int main()
{
int myv = 0;
Make42(&myv);
// now myv == 42
}
arg列表中的*
是这样的,Make42可以“接触”并修改传递给它的内容(在本例中是myv)
在您的代码中,fib数组上的**
也是出于同样的目的。您可以这样做(在知道测试定义不允许您这样做的情况下)
大体上
fib_sequence = fib(count);
这就更清楚地表明,您实际上是在操作一个简单的数组。您太复杂了。您只需要一个malloc
*fib_array = malloc(n * sizeof(int));
然后从任何地方删除第二个索引[0]
consfusion来自**int
。这看起来像一个多维数组。它不是-它声明的**
,因此您可以在调用者中设置值。一个简单的示例将有所帮助
void Make42(int* v)
{
*v = 42;
}
int main()
{
int myv = 0;
Make42(&myv);
// now myv == 42
}
arg列表中的*
是这样的,Make42可以“接触”并修改传递给它的内容(在本例中是myv)
在您的代码中,fib数组上的**
也是出于同样的目的。您可以这样做(在知道测试定义不允许您这样做的情况下)
大体上
fib_sequence = fib(count);
这就更清楚地表明,您实际上是在操作一个简单的数组,pm100是正确的,但对于初学者来说,这有点简短
首先,您传递了指向指针的指针。如果希望原始指针包含值,则需要取消对指向指针的指针的引用:
*fib_array = ...
通过仅指定指针(就像您在代码中所做的那样),您根本不会修改原始指针(fib_sequence
main)。由于您没有初始化它,它可能指向任何地方,因此在您尝试打印它的值时会出现分段错误
那么为什么要使用指向单个存储值的指针数组呢?您可以使用int
s的连续数组,您可以通过
*fib_array = malloc(n * sizeof(int));
好的,进一步使用不会太好((*fib_数组)[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);
pm100是正确的,但对于回答初学者来说有点简短
首先,您传递了指向指针的指针。如果希望原始指针包含值,则需要取消对指向指针的指针的引用:
*fib_array = ...
通过仅指定指针(就像您在代码中所做的那样),您根本不会修改原始指针(fib_sequence
main)。由于您没有初始化它,它可能指向任何地方,因此在您尝试打印它的值时会出现分段错误
那么为什么要使用指向单个存储值的指针数组呢?您可以使用int
s的连续数组,您可以通过
*fib_array = malloc(n * sizeof(int));
好的,进一步使用不会太好((*fib_数组)[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);
请不要将代码以图像的形式发布,而是以文本的形式发布,以便我们可以复制/粘贴它。您是否尝试使用gdb
来确定故障发生的位置?请不要将代码以图像的形式发布,而是以文本的形式发布,以便我们可以复制/粘贴它。您是否尝试使用gdb
来确定故障发生的位置?但是fib_数组的类型是int**,因此我使用了nested数据结构。我想我必须malloc两次?@Frank:fib_数组是指向另一个指针的指针。您使用pm100显示的单个malloc
,然后将结果分配给fib_数组
指针指向的指针。为此,您需要取消引用fib_数组
指针(注意前面的星号!)@Frank实际上fib\u数组是一个数组指针。它声明了**
,以便您可以在调用者中设置值。这与嵌套无关。如果fib被贴标以返回数组,它将只是*
。但是fib\u数组的类型是int**,所以我使用嵌套数据结构。我想我必须malloc两次?@Frank:fib\u ar射线是指向另一个指针的指针。您使用pm100显示的单个malloc
,并将结果分配给fib\u数组
指针所指向的指针。为此,您需要取消引用fib\u数组
指针(注意前面的星号!)@Frank really fib_array是一个数组指针。它声明了**
,以便您可以在调用者中设置值。这与嵌套无关。如果改为使用fib来返回数组,它将只是*
。非常感谢,非常感谢,非常感谢