2011-05-26 65 views
3

此代码:垃圾的价值,同时增加一个void *

#include <stdio.h> 
int main(void) 
{ 
    void *ptr; 
    int arr[] = {1,2,3,4,5}; 
    ptr = arr; 
    ptr++; 
    printf("%d",*(int*)ptr); 
} 

打印一些垃圾的价值,但我期待它打印2。为什么不打印2

+1

你还不明白就行'PTR ++'编译错误? – Simone 2011-05-26 06:53:33

回答

4

一些C编译器将char *作为void指针算术。它在C++中无效。

无论如何,你真的应该只是递增非void指针,因为指针算术依赖于数据类型大小和对齐的知识。

+1

“C对待void指针算术,因为它会处理char *” - 好吧,有些编译器是出于历史原因这样做的,但是它是否有效是否存在争议。 – detly 2011-05-26 07:13:07

+0

@detly是的,我可以看到我的答案是不准确的。我发现很难被void指针算术的细节所激发,因为它显然是一个坏主意。 – 2011-05-26 07:28:04

+1

您的意思是纯粹由于学术原因解决C标准的几个不明确的子条款**不是**您当天的亮点? – detly 2011-05-26 07:31:37

5

您无法对void指针执行指针运算,因为编译器对指向对象的大小没有任何意见。

您的代码不会在线上在线上编译。它是我猜想的另一个邪恶的gcc扩展。

+2

我认为gcc在执行算术时将'void *'视为'char *'。 – GManNickG 2011-05-26 07:01:21

+0

@GMan(和@Prasoon) - 这里有一些信息:[Pet Peeves:尝试增加空指针的人](http://talideon.com/weblog/2007/10/no-inc-voidp.cfm );另请参阅[GCC文档](http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Pointer-Arith.html#Pointer-Arith)。 – detly 2011-05-26 07:10:10

+0

@detly:感谢您的链接.. – 2011-05-26 07:13:03

-2

尝试

int *ptr 

PTR ++递增为int的大小在这种情况下

+0

这是不正确的。 – Simone 2011-05-26 06:58:53

+0

你的陈述是不正确的 - (ptr ++增加4)。正确的陈述应该是(ptr ++按int的大小增量) – Vijay 2011-05-26 07:36:07