2012-03-18 61 views
3

程序/应用程序如何知道内存地址中的数据是某种数据类型。在C中识别内存中的值的数据类型?

例如,假设存在int a;并且假设变量a存储在地址0x100中。存储的信息在哪里,它说是int

+0

另请参见[此复制](http://stackoverflow.com/questions/39206296/how-does-memory-determine-data-type-of-variable)这也吸引了一些很好的答案。 – 2016-08-30 01:05:36

回答

12

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

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

+1

“如果你把它们解释为双重的,上帝知道你会得到什么。”问题,通常。 'double'往往是64位。如果你将它们解释为'float',如果使用IEEE754,则它是NaN。 – 2012-03-18 20:02:07

6

没有地方,它只是由代码假设。

+0

需要注意的是,在其他语言(C++)中,有一个叫vtable的动态绑定,它包含了一些关于对象类型的信息。 – Mikhail 2012-03-18 19:48:54

+1

@Misha这个问题是关于C,这就是为什么我没有添加这个信息 – heinrich5991 2012-03-18 19:49:28

1

当C程序已经过去链接了,并且不需要在外面暴露任何符号时,这些数据就不再存在了。

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

3

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

考虑以下几点:

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

此代码需要一个指针到短变量,然后写入该变量,就像它是一个长。这会覆盖超出正在使用的变量所拥有的内存,导致未定义的行为。

+0

你可能是指'*(long *)&s'? – asaelr 2012-03-18 19:47:22

+0

哎呀!是的,固定的。 – 2012-03-18 19:48:01

+1

UB('(long)p'可能不对齐)。为了这个例子,更好地切换开关。 – 2012-03-18 21:05:14

2

该信息未被存储。例如,你可以做这样的事情

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

但不这样做,除非你真的知道你会怎么做。像这样的东西不重要是错误的常见方式。

+0

这为什么会出错?如果我们printf(“%c”,c)会发生什么; – 2012-03-18 19:58:56

+0

@SharatChandra如果你知道自己在做什么,那很好。只是如果有人不知道和做这样的事情,通常是无稽之谈。 – 2012-03-18 20:04:03

+0

@SharatChandra就像丹尼尔写道的那样,当你知道自己在做什么的时候,这很好,但即使在这个简单的例子中,“c”可能是0或15.在更复杂的情况下,我们还需要小心对齐。 – asaelr 2012-03-18 21:33:07