【问题标题】:C: ERROR After mallocing and passing 2D char array to functionC:错误在 mallocing 并将 2D char 数组传递给函数后
【发布时间】:2018-04-14 06:57:12
【问题描述】:

我不明白下面的代码有什么问题。它应该 malloc 一个 2D char array[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;
}

【问题讨论】:

  • strlen("Hello World") > 5
  • 指向指针的指针称为交错数组,与数组数组不同。参见例如this old answer of mine 了解原因的简单“图片”。
  • OT:#define LENGTH 5 嗯...你是说#define LENGTH 30 吗?

标签: arrays c malloc 2d


【解决方案1】:

main() 函数中,您传递双指针 array 并使用二维数组 array[][LENGTH] 捕获这是不正确的,只是说 双指针二维数组 反之亦然。

对于您在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】:

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

    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 的二维数组。

    顺便说一句:

    我认为你这里有一个错误

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

    【讨论】:

      猜你喜欢
      • 2010-11-19
      • 2018-12-02
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多