我正在尝试在单独的函数中动态创建一个数组并将一些变量存储在该数组中,我遇到了以下内容:当我写的时候怎么来了;
#include <stdio.h>
#include <stdlib.h>
void foo(int **arr, int N) {
*arr = malloc(sizeof(int));
for (int index = 0; index <= 4; index++) {
*arr[index] = 1;
}
}
int main() {
int *arr;
foo(&arr, 5);
for (int bar = 0; bar <= 4; bar++) {
printf("%d ", arr[bar]);
}
}
我得到这个输出;
exited, segmentation fault
但是,当我运行以下内容时;
#include <stdio.h>
#include <stdlib.h>
void foo(int **arr, int N) {
*arr = malloc(sizeof(int));
}
int main() {
int *arr;
foo(&arr, 5);
for (int index = 0; index <= 4; index++) {
arr[index] = 1;
}
for (int bar = 0; bar <= 4; bar++) {
printf("%d ", arr[bar]);
}
}
我得到这个输出;
1 1 1 1 1
我试图弄清楚如何修复第一个代码块以使其工作,但我似乎不知道该怎么做。任何帮助将不胜感激,至少可以理解为什么会发生分段错误。
这里有几件事是重要的细节。
Evgeny 是正确的,你需要分配 N 个大小为 int 的东西。 否则,程序是错误的,并将写入无效的内存位置。
段违规的原因需要几分钟才能找到。 我在整个代码中添加了 printf 语句,以便能够查看段冲突发生的位置。 它表明将 1 分配给数组元素是它发生的地方。
然后我怀疑绑定/顺序是问题所在,所以在 *arr 周围加上括号,以非常清楚地表明这是意图。 此后,分段违规行为消失了。 我还将初始化更改为索引,以便轻松验证分配结果。
#include <stdio.h>
#include <stdlib.h>
void foo(int **arr, int N)
{
*arr =(int *) malloc(sizeof(int) * N);
for (int index = 0; index < N; index++)
{
printf("before assignmentn");
(*arr)[index] = index;
printf("after assignmentn");
}
}
int main()
{
int *arr;
foo(&arr, 5);
for (int bar = 0; bar < 5; bar++)
{
printf("%d ", arr[bar]);
}
}
简而言之,一个有用的快速而肮脏的技术是插入一堆 printfs 以帮助缩小问题发生的位置。
malloc 需要完整的内存大小,包括数组大小。所以正确的代码是
*arr = malloc(sizeof(int) * N);