结构内存内容中的值是啥意思 - C
Posted
技术标签:
【中文标题】结构内存内容中的值是啥意思 - C【英文标题】:What is the meaning of the value inside memory content of a struct - C结构内存内容中的值是什么意思 - C 【发布时间】:2021-05-24 22:40:00 【问题描述】:我决定检查当我打印 结构实例的内存内容时会得到什么值:
#include <stdio.h>
#include <stdlib.h>
typedef struct
int value;
Data;
int main()
Data *d = (Data*) malloc(sizeof(Data));
printf("%d", *d);
return 0;
我得到的结果是一个随机值(对我来说),我尝试做各种实验,但不是这样我才能理解这个值背后的原因。但也许我只是不明白结构在内存中的存储方式。我想要一个解释。
【问题讨论】:
它没有被初始化,所以是的,它是一个“随机”值。从技术上讲,它是未定义的行为。 它没有初始化,所以不知道你会得到什么值。可能发生在你记忆中的任何事情。在某些系统上可能是一致的零,但不要依赖于此。 如果你这样做int d; printf("%d", d)
你期望什么输出?
malloc
返回一个指向分配用于存储结构的内存的指针。推迟指针本身并不能保证打印int value
,您应该为此执行d->value
。无论如何,您还没有初始化结构,因此 C 标准未定义行为。它很可能是以前在分配位置的“垃圾”/未使用内存。
@RDev 解决方案是添加 struct
关键字,而不是用无意义的 typedef 混淆代码。
【参考方案1】:
从malloc
返回的内存未初始化。在设置之前读取它会导致看到不确定值(即您看到的随机值),并且在某些情况下会触发undefined behavior。无法保证您甚至会从同一个内存位置两次读取相同的值。
您的打印方式也不正确。当给定的格式说明符需要int
时,您将结构的实例传递给printf
。这也会导致undefined behavior。
【讨论】:
“在某些情况下”?不是一直这样吗? @klutt 如果有问题的内存位置已被占用,并且用于访问它的左值正确对齐并且没有陷阱表示,则不会。 @dbush 谢谢。这个实例的内存地址是不是一段连续内存的开始? @RonDev 您从malloc
请求了sizeof(Data)
字节,因此返回的地址指向您可以写入的那么多字节。以上是关于结构内存内容中的值是啥意思 - C的主要内容,如果未能解决你的问题,请参考以下文章
_subtreeDescription 输出中的值是啥意思?