在C中使用“多维”“动态数组”

时间:2012-01-10 00:25:11

标签: c multidimensional-array segmentation-fault

我一直在尝试执行以下代码。虽然任务很简单,但我遇到了分段错误。

代码片段的目的是创建一个最大行大小为4和列大小为33的多维数组。然后在创建之后,它应该将所有行的内容设置为0,然后是{{1} }字符。最后,它应该在'\0'上显示输出。

虽然我不是编程的新手,但我仍然会遇到类似的错误,所以如果可能的话请解释我如何避免将来出现这样的错误。

stdout

3 个答案:

答案 0 :(得分:5)

你是memset错误的指针。

而不是:

memset(arr,0,8);

你想要:

memset(arr[i],0,8);

所以你离开了一个间接层。


正如评论中所指出的,这里有一些优化:

for ( i = 0; i < 4; i++) {
    arr[i] = (char*) malloc(9 * sizeof(char));
    memset(arr[i],0,9);
}

for ( i = 0; i < 4; i++) {
    arr[i] = (char*) calloc(9, sizeof(char));
}

请注意,C中不需要转换为char*


如果你想要字符'0'而不是空字符,那么你应该这样做:

for ( i = 0; i < 4; i++) {
    arr[i] = (char*) malloc(8 * sizeof(char));
    memset(arr[i],'0',8);
    arr[i][8] = '\0';
}

答案 1 :(得分:1)

memset(arr,0,8);

是问题,你正在清除指针数组

尝试:

memset(arr[i], '0', 8);

假设您要用零填充字符串

答案 2 :(得分:0)

在for循环中

我认为你有一个逻辑错误:

memset(arr[i],0,8);

你也不需要设置它:

arr[i][8] = '\0';

相反,你可以这样做:

memset(arr[i],0,9);

'\ 0'字符与0没什么不同。