在C语言中传递多维数组
我目前正在努力学习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
#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的评论,这绝对是正确的 除了通过阵列的方式外,还应检查一些其他问题:
您需要将“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来释放数组,而不仅仅是数组中的字符串。从技术上讲,您拥有的不是“多维数组”。您有一个指针数组,每个指针都指向一个较小维度数组的开头。“多维数组”指的是不同的东西,所有的内存都是连续分配的。