【发布时间】:2020-02-05 23:00:11
【问题描述】:
我目前正在进行的项目需要四个动态创建的字符串数组(每个字符串不超过 50 个字符)。因此,我正在尝试编写一个函数,该函数接受一个指向指针的指针并为该变量动态分配内存。
据我所知:
void makeArray(char*** arr[], int n) {
int i;
*arr = malloc(n*sizeof(char*));
for (i = 0; i<n; i++) {
*arr[i] = malloc(sizeof(char)*50);
}
}
int main() {
char** test;
makeArray(&test,4);
return 0;
}
当我编译和运行时,我得到这个错误:
main.c:16:13: warning: passing argument 1 of ‘makeArray’ from incompatible pointer type [-Wincompatible-pointer-types]
makeArray(&test,4);
^
main.c:4:6: note: expected ‘char ****’ but argument is of type ‘char ***’
void makeArray(char*** arr[], int n) {
当我使用 C Tutor 时,该函数似乎成功地接收了我的 test 数组并分配了 4 指针槽。然后它成功地将 50 个字符分配给 0th test 插槽。但是,当循环再次运行时,我得到一个错误。
我已经被困在这两天了,所以我欢迎 Stack Overflow 的好心用户提出任何建议!
【问题讨论】:
-
天啊,三星级程序员!问题:为什么函数返回void?
-
当我看到
char*** x[]时,我看到了四颗星。这是一个荒谬的指针主义水平。尽量保持在最多两个,如果绝对必要的话,三个。 -
更糟糕的是,
char ***arr[][超出了我的掌握范围。 -
该函数只是在原地修改了数组,所以不需要返回任何东西。我偷了here的***。
-
@chadathin 阅读这个问题和答案:Correctly allocating multi-dimensional arrays 当您在
malloc()周围调用嵌套循环来创建“数组”时,它将有助于解释您实际在做什么。当你这样做时,你并没有真正创建多维数组。您实际上是在创建指向一维值数组的指针数组的指针数组。对于大型 n 维“数组”,嵌套分配也可能非常慢。