English 中文(简体)
在C中传递多维数组
原标题:
  • 时间:2009-01-08 07:56:11
  •  标签:

我目前正致力于学习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
", array[i]);
    }

    return 0;
}

我不知道为什么在创建数组后无法读取其内容。我已经花了一个小时尝试理解为什么它失败了,但是毫无头绪。毫无疑问,这是一些微不足道的事情。

干杯 (gān bēi)

最佳回答

这是工作代码:

#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
", array[i]);
        free(array[i]);
    }
    free(array);
    return 0;
}

正如其他人所发布的-存在未使用的大小,而strdup会自动分配内存,释放内存后很好...

问题回答

你需要将“array”的地址传递给函数。也就是说,你需要char ***。这是因为你需要通过为其分配内存来更改array的值。

请将此翻译成中文:编辑:为了更完整,函数声明中需要有类似于

void make(char ***array, int *array_size)

然后您需要使用电话呼叫它

make(&array, &size);

在函数make中,分配内存

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

并相应地更改其他地方。

另外,就像Kauppi所指出的,strdup会为你分配内存,因此你不需要对每个字符串进行malloc。

请查看PolyThinker的评论,完全准确。

除了你传递数组的方式之外,你还应该检查一些其他问题:

  1. Perhaps you should assign something to array_size in make(...)?
  2. strdup(char*) allocates memory, the malloc for array[i] is not necessary.
  3. You should free all the memory you allocate after you don t need it anymore.

您正在将数组的当前值传递给make函数以进行复制(在堆栈上)。当您在make()函数中更改数组时,您只会更改复制品,而不是实际变量。尝试使用&按引用传递,或将其制作为char ***,并使用*array = ...。

尺寸已声明但没有被赋值(我想应该在 make 函数中进行赋值)。





相关问题
热门标签