我试图理解C中的结构的内存分配,但我坚持下去.
struct Person { char *name; int age; int height; int weight; }; struct Person *Person_create(char *name,int age,int height,int weight) { struct Person *who = malloc(sizeof(struct Person)); assert(who != NULL); who->age = age; who->height = height; who->weight = weight; who->name = strdup(name); return who; } int main(int argc,char *argv[]) { struct Person *joe = Person_create("ABC",10,170,60); printf("Size of joe: %d\n",sizeof(*joe)); printf("1. Address of joe \t= %x\n",joe); printf("2. Address of Age \t= %x\n",&joe->age); printf("3. Address of Height \t= %x\n",&joe->height); printf("4. Address of Weight \t= %x\n",&joe->weight); printf("5. Address of name \t= %x\n",joe->name); ...
我不明白的是这个结构的内存分配.在我的打印输出上,我看到了这个:
Size of joe: 24 1. Address of joe = 602010 2. Address of Age = 602018 3. Address of Height = 60201c 4. Address of Weight = 602020 5. Address of name = 602030
问题:
解决方法
对象joe的地址与数据成员年龄的地址之间没有间隙.此范围由数据成员名称占用.
struct Person { char *name; int age; //...
根据输出
1. Address of joe = 602010 2. Address of Age = 602018
它占用8个字节,即平台中的sizeof(char *)等于8.并且它的地址与对象joe本身的地址一致.
在这个声明中
printf("5. Address of name \t= %x\n",joe->name);
你没有输出名称本身的地址.您打印了存储在此指针中的值,此值是使用strdup获取的字符串文字“ABC”的副本的第一个字符的地址.
因此,输出4和5中的值之间存在差距,因为它们是不同的存储器范围.数据成员权重属于对象joe,而字符串文字“ABC”的副本存储在对象外部.该对象只有数据成员名称,指向文字副本的第一个字符.
由于name是指针,因此其大小计算如下
sizeof( char * )
要么
sizeof( joe->name )
如我在帖子开头所解释的那样等于8.
如果要确定字符串文字的长度,则应使用标题< string.h>中声明的标准函数strlen.例如
printf( "%zu\n",strlen( joe->name ) );