c - 在不使用 malloc() 的情况下,下面的程序如何工作?

标签 c string pointers struct 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(),就会出现“段错误”。

最佳答案

只要在源代码中包含 "Manuel" 就足以让编译器分配一个包含字符串 "Manuel" 的只读内存块。您的代码将此内存块的地址分配给 e.name

如果没有注释掉 malloc 调用,您的代码不会将字符串“Manuel”存储到使用 malloc 分配的内存中;相反,它分配 100 个字节(并使 e.name 指向 100 字节 block ),然后使 e.name 指向只读字符串“Manuel”(所以你现在没有指向 100 字节 block 的指针。

关于c - 在不使用 malloc() 的情况下,下面的程序如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28575585/

相关文章:

c++ - 如何在已弃用的函数中添加字符串或消息

C重定向导致scanf不接受输入

javascript - 如何检测和获取字符串javascript的url

C %p 打印 16 个字节而不是 8 个字节

c - 消除 void ** 与 any_struct_t ** 警告

c - 在 RPI 交叉编译器上链接 libwiringPi

java - Android - 如何从字符串资源中获取名称中包含两个或多个相似单词的所有元素

c# - 在c#中将字节转换为二进制字符串

c - 使用 Malloc 并在函数之间分配给数组

我可以访问内存中的任何内容吗?