#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;
}
嗨,如何确定错置后阵列有多少个插槽?当我打印 sizeof(*array) 时,我得到数字 1044,但是当我尝试运行循环并在每个插槽中设置测试值时,我只得到 282 在段错误之前。sizeof和malloc有什么区别?为什么我的数组只接受最大 282 的值,而 的大小说它是 1044?为什么我可以编辑 421 的插槽,但它在我的循环中最多存在 282 个段错误?谢谢<</p>
我想你的意思
是struct Test *array = malloc(MAX_NUM * sizeof(struct Test));
还是我错过了什么?
对于静态分配的数组,您可以使用sizeof(array)/sizeof(*array)
:
array
占用的内存总量为sizeof(array)
。单个条目占用的内存量为
sizeof(*array)
。因此,
array
中的条目数为sizeof(array)/sizeof(*array)
。
但是,对于动态分配的数组,您必须使用 MAX_NUM
的值,因为array
是一个指针,因此 sizeof(array)
= 指针的大小,即 4 或 8 个字节(取决于您的系统)。
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;
}