在C中使用"多维""动态数组"

uye*_*tch 1 c segmentation-fault multidimensional-array

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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{
        int i,j,k,x,y;
        char** arr;
        arr = (char**) malloc(4 * sizeof(char*));
        for ( i = 0; i < 4; i++) {
                arr[i] = (char*) malloc(9 * sizeof(char));
                memset(arr,0,8);
                arr[i][8] = '\0';
        }
        for ( j = 0; j<4; j++) {
                puts(arr[j]);
        }
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mys*_*ial 5

memset错了指针.

代替:

memset(arr,0,8);
Run Code Online (Sandbox Code Playgroud)

你要:

memset(arr[i],0,8);
Run Code Online (Sandbox Code Playgroud)

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


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

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

要么

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

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


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

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