我正在做一个结构的简单程序,为该结构分配了12个字符的内存。name(第14行(,但sizeof(p[I].name((第32行(的打印显示的是8而不是12。为什么要这样做?
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
typedef struct person{
char *name;
uint32_t age;
}person_;
int main()
{
person_ p[3];
uint32_t i,j;
for(i = 0;i<3;i++){
p[i].name = malloc(sizeof(char) * 12);
if(p[i].name == NULL){
fprintf(stderr,"Error allocating memoryn");
for(j = 0;j<i;j++){
free(p[i].name);
}
exit(1);
}
}
for(i = 0;i<3;i++){
if(fgets(p[i].name,sizeof(p[i].name),stdin) == NULL){
fprintf(stderr,"Error reading stringn");
exit(2);
}
}
for(i = 0;i<3;i++){
printf("%s",p[i].name);
printf("sizeof(%d)",sizeof(p[i].name));
}
for(j = 0;j<3;j++){
free(p[j].name);
}
}
好吧,p[i].name
是char *
,也就是说,指向字符的指针。指向平台上字符的指针大小为8个字符。因此sizeof(p[i].name)
返回8。
请注意对象的大小与其值无关。因此,p[i].name
指向其中有12个字符的某个位置对p[i].name
本身的大小没有影响。
想想看,如果执行p[i].name = NULL;
会改变p[i].name
的大小,那会有多奇怪。这12个字符仍然是相同的大小,并且p[i].name
仍然有4个字符持有NULL
。
当你为一个对象分配空间时,你在知道它的值之前就已经这样做了。所以大小不能取决于值。