代码之家  ›  专栏  ›  技术社区  ›  Gandalf1989

C: mallocing并将2D char数组传递给函数后出错

  •  -1
  • Gandalf1989  · 技术社区  · 6 年前

    我不明白下面的代码有什么问题。它应该malloc一个2D char数组[5][30](称为LENGTH),将其传递给函数并用字符串填充。它在功能上工作得很好;我可以从那里毫无问题地打印出来。但我甚至无法打印main()函数中的第一个函数(如果我尝试,应用程序会崩溃)。 谁能解释一下我做错了什么?

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define LENGTH 5 
    void fillArray(char array[][LENGTH]) {
        for (int i = 0; i < 5; i++) {
            strcpy(array[i],"Hi World");
        }
        for (int i = 0; i < 5; i++) {
            printf("%s\n",array[i]);
        }
    }
    
    int main() {
        char** array = (char**)malloc(5*sizeof(char*));
        for (int i = 0; i < 5; i++) {
            array[i] = (char*)malloc(LENGTH);
        }
        fillArray(array);
        printf("%s",array[0]);
        getchar();
        return 0;
    }
    
    2 回复  |  直到 3 年前
        1
  •  0
  •   Achal    6 年前

    从…起 main() 传递双指针的函数 array 并使用2D阵列捕捉 array[][LENGTH] 这是不对的,只是说 双指针 不类似于 2D阵列 &反之亦然

    用于中的任务 fillArray() 使用 array of char pointer 作为论据,有多少? LENGTH

    void fillArray(char *array[LENGTH]) { /* this is okay */
            for (int i = 0; i < 5; i++) {
                    strcpy(array[i],"Hi World");/*now in `array[i]` you can store any no of char. */
            }
            for (int i = 0; i < 5; i++) {
                    printf("%s\n",array[i]);
            }
    }
    

    同时铸造 malloc() 不需要,一旦工作最终完成,不要忘记 释放动态分配的内存 通过调用 free() 对于每个。

        2
  •  0
  •   Support Ukraine    6 年前

    基本问题是,函数需要一个二维数组,但传递给函数的不是二维数组。

    在里面 main 分配一个一维指针数组。然后,为每个指针分配一个一维字符数组。 这不是二维阵列

    所以你的函数并没有得到它所期望的结果,因此你的程序失败了。

    因此,不是:

    char** array = (char**)malloc(5*sizeof(char*));
    for (int i = 0; i < 5; i++) {
        array[i] = (char*)malloc(LENGTH);
    }
    

    尝试以下操作:

    char (*array)[LENGTH] = malloc(5*LENGTH*sizeof(char*));
    

    获取正确的malloc'ed 2D数组。

    顺便说一句:

    我想你这里有个虫子

    #define LENGTH 5
                   ^
                   I guess you want 30 instead of 5