我使用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>
答案 0 :(得分:3)
*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);