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

时间:2018-01-25 17:00:29

标签: c

我使用fibonacci的嵌套数据结构,但我有一个分段错误11。

<?xml version="1.0" encoding="Windows-1250"?>
<document>
    <datasets>
        <dataset0>
            <rows>
                <row>
                    <fields>
                        <id>1</id>
                        <name>Cat1</name>
                    </fields>
                </row>
                <row>
                    <fields>
                        <id>2</id>
                        <name>Cat2</name>
                    </fields>
                </row>                
            </rows>
        </dataset0>
    </datasets>
</document>

2 个答案:

答案 0 :(得分:3)

你过于复杂了。你只需要一个malloc

*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);

这使得你真正操纵一个简单的数组

更加清晰

答案 1 :(得分:1)

pm100是对的,但回答初学者的时间有点短......

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

*fib_array = ...

通过仅指定指针(就像在代码中所做的那样),您根本不会修改原始指针(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);