在C中识别内存中值的数据类型?

程序/应用程序如何知道内存地址中的数据是某种数据类型。

例如,假设有一个int a; 并假设变量a存储在地址0x100 。 存储的信息在哪里说它是int类型?

在像C这样的语言中,信息总是以您解释数据的方式 “存储”。 编译器添加了一些好处,它在某种程度上理解了变量的类型,并试图阻止无意义的操作。

例如,假设您有位: 0xFFFFFFFF 。 如果您将它们解释为“32b unsigned int”,您将获得4294967295 。 如果你将它们解释为“32b signed int”,你将获得-1 (*) 。 如果你把它们解释为双重,那么上帝知道你会得到什么。

无处,它只是由代码假设。

AC应用程序不存储类型信息。 唯一的强制措施是如何使用数据。 而且,在C中,滥用执法是一件非常简单的事情。

考虑以下:

 short s; short *p = &s; *(long*)p = 0; 

此代码获取指向short变量的指针,然后写入该变量,就好像它是一个long。 这会覆盖超出所用变量所拥有的内存,从而导致未定义的行为。

不存储此信息。 例如,你可以做类似的事情

 int i=15; char *p=(char*)&i; char c=*p; //Now, c contain the first byte of 15, which may be 15 or 0 

但除非你真的知道你做了什么,否则不要这样做。 像这样的东西不小心是一种常见的错误方法。

当C程序过去链接,并且不需要在外部公开任何符号时,此数据不再存在。

数据类型与语言相关,当可执行文件准备就绪时,语言不再起作用,因为现在它是所有内存和处理器。