为什么 sizeof 打印的是 8 而不是 12
why sizeof is printing 8 instead of 12
我正在做一个简单的结构程序,为 struct.name 分配了 12 个字符的内存(第 14 行),但是 sizeof(p[i].name) 的打印(第 32 行)正在显示8 而不是 12。为什么要这样做 that?
#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 memory\n");
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 string\n");
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)
returns 8.
请注意,对象的大小与其值无关。因此 p[i].name
指向其中有 12 个字符的某个地方对 p[i].name
本身的大小没有影响。
想想如果 p[i].name = NULL;
改变了 p[i].name
的 size 会有多奇怪。这 12 个字符的大小仍然相同,p[i].name
仍然有四个字符包含 NULL
.
当你为一个对象分配 space 时,你在知道它的值之前就这样做了。所以大小不能取决于值。
我正在做一个简单的结构程序,为 struct.name 分配了 12 个字符的内存(第 14 行),但是 sizeof(p[i].name) 的打印(第 32 行)正在显示8 而不是 12。为什么要这样做 that?
#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 memory\n");
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 string\n");
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)
returns 8.
请注意,对象的大小与其值无关。因此 p[i].name
指向其中有 12 个字符的某个地方对 p[i].name
本身的大小没有影响。
想想如果 p[i].name = NULL;
改变了 p[i].name
的 size 会有多奇怪。这 12 个字符的大小仍然相同,p[i].name
仍然有四个字符包含 NULL
.
当你为一个对象分配 space 时,你在知道它的值之前就这样做了。所以大小不能取决于值。