在C语言中传递多维数组

在C语言中传递多维数组,c,arrays,argument-passing,dynamic,C,Arrays,Argument Passing,Dynamic,我目前正在努力学习C语言,我遇到了一个我一直无法解决的问题 考虑: #include <stdio.h> #include <stdlib.h> #include <string.h> #define ELEMENTS 5 void make(char **array, int *array_size) { int i; char *t = "Hello, World!"; array = malloc(ELEMENTS * si

我目前正在努力学习C语言,我遇到了一个我一直无法解决的问题

考虑:

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

#define ELEMENTS 5

void make(char **array, int *array_size) {
    int i;
    char *t = "Hello, World!";

    array = malloc(ELEMENTS * sizeof(char *));

    for (i = 0; i < ELEMENTS; ++i) {
        array[i] = malloc(strlen(t) + 1 * sizeof(char));
        array[i] = strdup(t);
    }
}

int main(int argc, char **argv) {
    char **array;
    int size;
    int i;

    make(array, &size);

    for (i = 0; i < size; ++i) {
        printf("%s\n", array[i]);
    }

    return 0;
}
#包括
#包括
#包括
#定义要素5
无效生成(字符**数组,整数*数组大小){
int i;
char*t=“你好,世界!”;
数组=malloc(元素*sizeof(字符*);
对于(i=0;i
我不知道为什么上面的代码在创建数组后无法读回数组的内容。我确实花了一个小时试图理解为什么它失败了,但结果却是空手而归。毫无疑问,这是件小事


干杯,

请看PolyThinker的评论,这绝对是正确的

除了通过阵列的方式外,还应检查一些其他问题:

  • 也许您应该为make(…)中的数组_size指定一些内容
  • strdup(char*)分配内存,不需要数组[i]的malloc
  • 在不再需要内存后,应该释放所有分配的内存

  • 您需要将“array”的地址传递到函数中。也就是说,你需要一份工作。这是因为您需要通过分配内存来更改数组的值

    编辑:为了使它更完整,在函数声明中,您需要

    void make(char ***array, int *array_size)
    
    然后你需要使用

    make(&array, &size);
    
    在函数make中,使用

    *array = malloc(ELEMENTS * sizeof(char *));
    
    并相应地改变其他地方


    此外,正如kauppi所指出的,strdup将为您分配内存,因此您不需要对每个字符串执行malloc

    声明了size,但未指定任何值(我想这应该发生在函数make中)。

    您将数组的当前值作为副本(在堆栈上)传递给make。在make()中更改数组时,只更改副本,而不是实际变量。尝试通过引用传递&,或者将其设置为字符***并使用*array=…

    以下是工作代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define ELEMENTS 5
    
    void make(char ***array) {
        char *t = "Hello, World!";
    
        *array = malloc(ELEMENTS * sizeof(char *));
    
        int i;
        for (i = 0; i < ELEMENTS; ++i) {
            (*array)[i] = strdup(t);
        }
    }
    
    int main(int argc, char **argv) {
        char **array;
        make(&array);
    
        int i;
        for (i = 0; i < ELEMENTS; ++i) {
            printf("%s\n", array[i]);
            free(array[i]);
        }
        free(array);
        return 0;
    }
    
    #包括
    #包括
    #包括
    #定义要素5
    无效生成(字符***数组){
    char*t=“你好,世界!”;
    *数组=malloc(元素*sizeof(字符*);
    int i;
    对于(i=0;i

    正如另一位所发布的-有未使用的大小,strdup自己分配内存,之后释放内存很好…

    在标准C中,我认为在调用make(&array)之后(或者在make()函数中的malloc之后)不能声明'int I'。我使用默认的gcc选项编译它。我认为这是很久以前添加到标准中的。。。但是我不能在没有-C99的情况下在循环中使用decarint…即使使用:gcc arr.c-Wall-strict-ansi或gcc arr.c-std=c88进行编译也不会出现任何警告或错误当然,sgcc arr.c-std=c89;)-std=c88不会运行编译器;PRemember来释放数组,而不仅仅是数组中的字符串。从技术上讲,您拥有的不是“多维数组”。您有一个指针数组,每个指针都指向一个较小维度数组的开头。“多维数组”指的是不同的东西,所有的内存都是连续分配的。