在菜单化后,我如何知道阵列中有多少个插槽?

时间:2014-02-06 22:55:11

标签: c arrays segmentation-fault malloc sizeof

#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?谢谢

3 个答案:

答案 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;

}