在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程序过去链接,并且不需要在外部公开任何符号时,此数据不再存在。
数据类型与语言相关,当可执行文件准备就绪时,语言不再起作用,因为现在它是所有内存和处理器。