分配char **时的奇怪行为

问题描述

我试图创建一个字符串数组,并使用一个函数将其填充为字符“ 0”。代码如下:

void    init_array(char **array)
{
    int i;
    int j;

    i = 0;
    while (i < 4)
    {
        array[i] = (char*)malloc(sizeof(char) * 5);
        j = 0;
        while (j < 4)
        {
            array[i][j] = '0';
            array[i][4] = '\0';
            j++;
        }
        i++;
    }
}

int main(void)
{
    char **c;
    c = (char**)malloc(sizeof(**c) * 4);
    init_array(c);
    for (int i = 0; i < 4; i++)
        printf("%s\n",c[i]);
}

这将打印带有0的数组,但第一行除外,该行显示奇怪的字符(问号等)。奇怪的是,如果我将i函数中的init_array的值更改为-1,则整个数组将正确显示。谁能解释我在做什么错?

解决方法

**c的类型为char,因此sizeof(**c)为1。将第一个数组分配替换为:

c = (char**)malloc(sizeof(*c) * 4);