C 动态内存分配如何工作

标签 c pointers malloc dynamic-memory-allocation

我找到了以下示例:

typedef struct {
    char * name;
    char age;
} person;

person * myperson = malloc(sizeof(person));

myperson->name = "John";
myperson->age = 27;

( http://www.learn-c.org/en/Dynamic_allocation )

我认为我在示例中分配了 8 个字节 (sizeof(person))。所以我想当我将“justatestfoobar”分配给 myperson->name...

时,我会炸毁程序

有人可以解释一下为什么以及如何工作吗?

最佳答案

当你写的时候

 person * myperson = malloc(sizeof(person));

它为myperson变量(指针)分配内存,即为myperson->namemyperson->age成员变量分配内存他们自己。

myperson->name(作为指针)指向的内存位置暂时无效。换句话说,myperson->name本身是一个有效的访问,但是当你尝试使用myperson->name指向的内存位置的内容,它将是 UB,因为指针值不确定。您需要为指针单独分配内存。

接下来,

 myperson->name = "John";

是有效的,因为您将字符串文字 "John" 的起始地址存储到指针。此后您可以使用指针内容。 (请记住,由于 myperson->name 指向字符串文字,因此您不能更改它。)

为了扩展这个答案,让我声明一下,如果您想复制一个字符串myperson->name指向的内存位置,那么首先需要给 myperson->name 分配内存。例如,

 myperson->name  = malloc(32);    //allocate memory 
 strcpy(myperson->name, "Hello");  //write to that memory

关于C 动态内存分配如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36959592/

相关文章:

c - 在 Windows 7 上安装 PortAudio 以与 Cygwin 一起使用

c - 将 YUV 转换为 RGBA 的最快近似方法?

c - 为什么我的进程总是收到信号SIGPIPE,然后管道坏了。我在gdb看到了

c - 为什么声明 unsigned char "Volatile"会使其与 "non-volatile"unsigned char 不兼容?

c - malloc() 在无限循环中

c - 具体字符串识别和提取

c - 在递归调用中给出指针参数

c++:在if中分配一个变量

c - 为什么空闲列表没有排序?

c - 尝试读取隐藏文件 linux 时出现段错误