Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 动态分配数组的新手。为什么我在这里有分段错误?_C - Fatal编程技术网

C 动态分配数组的新手。为什么我在这里有分段错误?

C 动态分配数组的新手。为什么我在这里有分段错误?,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){

我对斐波那契使用嵌套数据结构,但我有一个分段错误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;
}
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来返回数组,它将只是
*
。非常感谢,非常感谢,非常感谢