sscanf如何处理重叠的指针?

sscanf如何处理重叠的指针?

问题描述:

我有一个c程序,我试图扭转工程师ia32 assembly代码。在一种方法中它似乎有(假定input_phrase是c串和ebp是一个指针)的线"sscanf(input_phrase, "%d %c %d", ebp-4, ebp-9, ebp-8);"。鉴于char是16位,它存储char的空间应该与它存储第二个int的空间重叠(并且通过测试,我发现这是这种情况)。对于这个代码应该如何工作还是不可预测,有没有精确的定义?sscanf如何处理重叠的指针?

+3

@nhahtdh甲'char'在C 1个字节,而不是8位。 – 2013-03-09 07:49:01

+0

@nhahtdh 1个字节(最小长度为8位) – 2013-03-09 07:51:54

实际问题的答案是“它不” - 我不完全确定规范是否提到它,但我100%确定scanf没有“哦,这与此重叠,所以我会做一些不同的事情“ - 你只是得到未定义的行为。尝试这样的事情的结果是完全不可预测[它很可能只是导致无论是阅读最后覆盖不管它,第一读重叠 - 但它也可能导致崩溃或第三次世界大战爆发]

幸运的是,示出不调用该行为,如在C char代码被定义为具有尺寸为1,所以没有冲突。

C标准计数以char为单位的大小,所以char的大小是按照定义1.除非你在一些奇怪的硬件(信号处理器,pdp-10或类似的东西),这也将对应于一个正常的8位字节。由于你在x86架构上,你似乎错误地认为变量是重叠的。

在x86,char将在大小为8位(1个字节)。因此,在堆栈上,变量被布局为

CJJJJIIII 
     ^ebp 

其中I是int,C是字符和J是第二INT。没有重叠。

+0

C中的char和byte都至少有8位。 C的'byte'不应该与普通的8位'byte',AKA ['octet'](http://en.wikipedia.org/wiki/Octet_%28computing%29)混淆。 – 2013-03-09 08:15:01

+0

是的,是的,它是特定于系统。尽管如此,我认为每个x86处理器上的每个C编译器都是如此,所以我调整了答案。 – nneonneo 2013-03-09 08:16:12