C没有正确地为结构数组分配内存吗?
问题描述:
struct student{
int id;
int score;
};
struct student* allocate(){
struct student* students = (struct student*)malloc(sizeof(struct student)*10);
return students;
}
void generate(struct student* students){
int i=0;
printf("%lu\n", sizeof(students));
printf("%lu\n", sizeof(struct student));
int length = sizeof(students)/sizeof(struct student);
printf("%d\n", length);
for(i=0;i<length;i++){
printf("hi\n");
}
}
我有这样的代码应该创建的10层学生结构的阵列。当我到达generate函数并尝试查看学生数组分配了多少内存时,它只能说8个字节,与单个学生结构本身相同,当我进入for循环时,它仅在打印时发出“hi”一次应该是8次。我做错了什么?C没有正确地为结构数组分配内存吗?
输出:
8
8
1
hi
答
我做了什么错?
students
是一个指针,所以sizeof(students)
给你一个指针的大小。它不会给你students
指向的数组大小。
勉强够,sizeof(*students)
也不起作用 - 它给你的大小一个学生,而不是整个阵列的大小。这是因为students
只针对第一名学生,就编译器而言。
没有内置的方式来获得一个数组的大小,给出一个指向它的开始。你需要自己跟踪大小。
“......查看学生阵列分配了多少内存......”。是什么让你相信operator'sizeof'适合这个目的?你是怎么想出使用'sizeof'的想法的? – AnT
sizeof(students)给你一个指针的大小,而不是数组的大小。 –
那么获得数组大小的最佳方法是什么? – izzzi