#include <stdlib.h>
#include <stdio.h>
#define MAX_NUM 65536
struct Test{
int t;
char args[16][65];
};
int main(int argc, char ** argv) {
//
struct Test *array = malloc(MAX_NUM * sizeof(struct Test*));
printf("%d", sizeof(*array));
for(int i = 0; i < sizeof(*array); i++) {
printf("%d", i);
printf(" ");
array[i].t = 0;
}
array[421].t = 5;
printf("%d", array[421].t);
free(array);
return 0;
}
嗨,我如何确定在对其进行mallocing之后我有多少个插槽?当我打印sizeof(* array)时,我得到数字1044,但是当我尝试遍历循环并在每个插槽中设置测试值时,我在segfaulting之前只得到282。 sizeof和malloc有什么区别?为什么我的数组只接受最大值为282的值,当它的大小为1044时?为什么我可以在421编辑一个插槽但在我的循环中它会跳转到282?谢谢
答案 0 :(得分:1)
对于静态分配的数组,您可以使用sizeof(array)/sizeof(*array)
:
array
占用的内存总量为sizeof(array)
。
单个条目占用的内存量为sizeof(*array)
。
因此,array
中的条目数为sizeof(array)/sizeof(*array)
。
但是,对于动态分配的数组,您必须使用MAX_NUM
的值,因为array
是指针,因此sizeof(array)
=指针的大小,这是4或8个字节(取决于您的系统)。
答案 1 :(得分:1)
我认为你的意思是
struct Test *array = malloc(MAX_NUM * sizeof(struct Test));
或者我错过了什么?
答案 2 :(得分:1)
malloc错误:必须使用sizeof(struct Test)而不使用*。 您还应该使用MAX_NUM作为迭代次数。
sizeof(* array)返回数组的第一个元素的大小,即sizeof(struct Test),而不是数组的长度。
#include <stdlib.h>
#include <stdio.h>
#define MAX_NUM 65536
struct Test{
int t;
char args[16][65];
};
int main(int argc, char ** argv) {
//Changed Key to Test type
struct Test *array = (Struct Test*)malloc(MAX_NUM * sizeof(struct Test));
printf("%d", sizeof(*array));
for(int i = 0; i < MAX_NUM; i++) {
printf("%d", i);
printf(" ");
array[i].t = 0;
}
array[421].t = 5;
printf("%d", array[421].t);
free(array);
return 0;
}