我是这样定义三维数组的,但它不能读取任何字符串?问题出在哪里?谢谢!!!数据[0][0]显示为空。
int stuTotal, courseTotal,i,k;//a dynamic array
printf("Input the total number of students that you would like to import:");
scanf("%d", &stuTotal);
printf("Input the total number of courses that you would like to import:");
scanf("%d", &courseTotal);
char ***data = (char***)calloc(stuTotal,sizeof(char));//data
for(i = 0;i < stuTotal;i++){
data[i] = (char**)calloc(courseTotal,sizeof(char));
for (k = 0;k < courseTotal;k++){
data[i][k] = (char*)calloc(20,sizeof(char));
}
}
strcpy(data[0][0],"hello");
data[0][0]显示为空。
你的参数 sizeof
当你分配外部数组时,是不正确的--而不是用
char ***data = (char***)calloc(stuTotal,sizeof(char));
需要
char ***data = (char***)calloc(stuTotal,sizeof(char **)); // you're allocating N elements of type `char **`.
你可以将这个调用大大简化如下。
char ***data = calloc( stuTotal, sizeof *data ); // sizeof *data == sizeof (char **)
同理
data[i] = calloc( courseTotal, sizeof *data[i] ); // sizeof *data[i] == sizeof (char *)
的结果,你应该不需要投掷 malloc
和 calloc
除非你是在C++中工作(在这种情况下,你应该使用 new
或者,更好的是,某种容器类型)或者是一个 古老 C的实现(1989年以前).你应该使用sizeof(char**)来处理三维 "数据 "数组,因为这个三维数组的每个元素都是char**。
你应该对3d "data "数组使用sizeof(char**),因为这个3d数组的每个元素都是char**。
int stuTotal, courseTotal,i,k;//a dynamic array
printf("Input the total number of students that you would like to import:");
scanf("%d", &stuTotal);
printf("Input the total number of courses that you would like to import:");
scanf("%d", &courseTotal);
char ***data = (char***)calloc(stuTotal,sizeof(char**));//data
for(i = 0;i < stuTotal;i++){
data[i] = (char**)calloc(courseTotal,sizeof(char*));
for (k = 0;k < courseTotal;k++){
data[i][k] = (char*)calloc(20,sizeof(char));
}
}
strcpy(data[0][0],"hello");
你指定了无效的分配对象的大小。
你必须写
char ***data = (char***)calloc(stuTotal,sizeof(char **));//data
^^^^^^^
for(i = 0;i < stuTotal;i++){
data[i] = (char**)calloc(courseTotal,sizeof(char *));
^^^^^^
for (k = 0;k < courseTotal;k++){
data[i][k] = (char*)calloc(20,sizeof(char));
}
}
如果你的编译器支持可变长度的数组,那么你可以通过调用 malloc
或 calloc
只有一次。例如
char ( *data )[courseTotal][20] =
malloc( sizeof( char[stuTotal][courseTotal][20] ) );
或
char ( *data )[courseTotal][courceName] =
calloc( 1, sizeof( char[stuTotal][courseTotal][courceName] ) );
下面是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
size_t stuTotal = 5, courseTotal = 10, courceName = 20;
char ( *data )[courseTotal][courceName] =
calloc( 1, sizeof( char[stuTotal][courseTotal][courceName] ) );
strcpy(data[0][0],"hello");
puts( data[0][0] );
free( data );
return 0;
}
它的输出是
hello
在这种情况下,为了释放所有分配的内存,需要调用 free
只有一次。