我一直在阅读“Learn C the Hard Way”,遇到了一个有趣的问题,希望有人能详细解释一下。基本练习是使用包含示例 Person 结构的结构。在第一种情况下,我有一个构造函数式的方法(如果有人不介意在侧面解释的话,我不完全明白为什么教程会这样做:D)以及这样的结构:
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->name = strdup(name);
who->age = age;
who->height = height;
who->weight = weight;
}
与其余代码一起,它运行得很好,但是当我打印指向这些结构的指针的内存位置时,例如:
int main(int argc, char* argv[]) {
struct Person *joe = Person_create("joe alex", 12, 80, 100);
struct Person *joe = Person_create("frank blank", 20, 72, 140);
}
它们的内存值之差总是正好 40。相比之下,struct 构造函数的实现如下:
struct Person{//is the same as above};
struct Person Person_create (char* name, int age, int height, int weight) {
struct Person newPerson;
newPerson.name = name; //and so on
return newPerson
}
当我打印出 joe 和 frank 的内存位置时,使用与上述相同的值进行初始化,通过上述实现,它们的内存位置差异似乎总是 20。
我研究了一些汇编,我知道编译器会根据结构的数据类型分配内存块,所以我在想.. 在任何一种实现中,char 数组都有很多字符,所以 n 个字符 * 1 = char 空间,然后我有 3 个整数,所以 3*4 = 12; 12 + 9 (Joe Alex\0 对吗?) = 21.. 我可能弄错了 \0 所以它等于 20 或其他东西,但不管我的结构的具体内存大小如何,我更感兴趣的是为什么这两个不同的实现会导致不同的内存大小(据我了解,双倍的内存成本是相当可观的)。