在不使用 malloc() 的情况下,下面的程序如何工作?
How is the below program working without using malloc()?
我有以下C程序。
#include<stdio.h>
#include<stdlib.h>
enum country_name
{
Germany, France, Spain
};
int main()
{
struct employee
{
char *name;
int age;
float bs;
enum country_name country;
};
typedef struct employee EMPLOYEE;
EMPLOYEE e;
//e.name = malloc(30);
e.name = "Manuel";
e.age = 25;
e.bs = 25000;
e.country = Germany;
printf("Name: %s\n",e.name);
printf("Age: %d\n",e.age);
printf("Salary: %f\n",e.bs);
printf("Country: %d\n",e.country);
return 0;
}
如您所见,我已经对 malloc() 进行了注释。我期待某种类型的警告或错误。
然而,当我 运行 程序时,它给出了预期的输出。
-bash-4.1$ ./a.out
Name: Manuel
Age: 25
Salary: 25000.000000
Country: 0
-bash-4.1$
我在想我需要使用 malloc() 来分配内存。在这种情况下真的不需要 malloc() 吗?
编辑:阅读以下答案后。
好的,所以我想我正在尝试这样做,看看注释掉 malloc() 是否会导致任何错误。
char nameHold[30] = "Manuel";
e.name = malloc(30);
strcpy(e.name, namoHold );
在这种情况下,如果我不使用 malloc(),我会得到 "segmentation fault"。
只要在源代码中包含 "Manuel"
就足以让编译器分配一个包含字符串 "Manuel"
的只读内存块。您的代码将此内存块的地址分配给 e.name
.
没有注释掉 malloc
调用,您的代码 不会 将字符串 "Manuel" 存储到 malloc
分配的内存中;相反,它分配 100 个字节(并使 e.name
指向 100 字节块),然后使 e.name
指向只读字符串 "Manuel"(因此您现在没有指向100 字节块)。
我有以下C程序。
#include<stdio.h>
#include<stdlib.h>
enum country_name
{
Germany, France, Spain
};
int main()
{
struct employee
{
char *name;
int age;
float bs;
enum country_name country;
};
typedef struct employee EMPLOYEE;
EMPLOYEE e;
//e.name = malloc(30);
e.name = "Manuel";
e.age = 25;
e.bs = 25000;
e.country = Germany;
printf("Name: %s\n",e.name);
printf("Age: %d\n",e.age);
printf("Salary: %f\n",e.bs);
printf("Country: %d\n",e.country);
return 0;
}
如您所见,我已经对 malloc() 进行了注释。我期待某种类型的警告或错误。
然而,当我 运行 程序时,它给出了预期的输出。
-bash-4.1$ ./a.out
Name: Manuel
Age: 25
Salary: 25000.000000
Country: 0
-bash-4.1$
我在想我需要使用 malloc() 来分配内存。在这种情况下真的不需要 malloc() 吗?
编辑:阅读以下答案后。
好的,所以我想我正在尝试这样做,看看注释掉 malloc() 是否会导致任何错误。
char nameHold[30] = "Manuel";
e.name = malloc(30);
strcpy(e.name, namoHold );
在这种情况下,如果我不使用 malloc(),我会得到 "segmentation fault"。
只要在源代码中包含 "Manuel"
就足以让编译器分配一个包含字符串 "Manuel"
的只读内存块。您的代码将此内存块的地址分配给 e.name
.
没有注释掉 malloc
调用,您的代码 不会 将字符串 "Manuel" 存储到 malloc
分配的内存中;相反,它分配 100 个字节(并使 e.name
指向 100 字节块),然后使 e.name
指向只读字符串 "Manuel"(因此您现在没有指向100 字节块)。