打印void指针的值

时间:2013-06-05 21:46:13

标签: c arrays pointers void

我有一个返回void指针的函数。让我们说我知道指向的数据块是一个int数组。我该如何打印?

从另一个线程我看到我以这种方式将void作为我想要的数据类型:

printf("%i",*((int*)data));

但就像我说的那样,数据就是一个整数。我试图这样做,但这不是一个有效的表达式:

for(i = 0; i<3; i++){
    printf("%i \n", *((int*)(data+sizeof(int)*i)));
}

打印这个的正确方法是什么?

2 个答案:

答案 0 :(得分:7)

只需使用临时int*

int *p = data;
for (int i=0; i<3; i++)
    printf("%i\n", p[i]);

请注意,第一行中没有显式强制转换,因为void*不需要这样做,并且避免显式强制转换被认为是好的C样式。在循环内部,我已经使用了这样一个事实:你可以索引一个指向数组的指针,就好像它是数组本身一样。

答案 1 :(得分:3)

您在“正式”C中的原始尝试不正确,因为指针算法不适用于void *指针。但是,一些编译器支持void *指针上的指针算法作为非标准扩展(GCC是一个值得注意的例子)。在这样的编译器void *中,指针被视为char *指针用于算术目的。而你的

for(i = 0; i < 3; i++)
    printf("%i\n", *((int *) (data + sizeof(int) * i)));

实际上可以在这样的编译器中按预期工作。

使用更迂腐的编译器,您可以通过

来节省一天
for(i = 0; i < 3; i++)
    printf("%i\n", *((int *) ((char *) data + sizeof(int) * i)));

但无论如何,上面两段代码无可救药地过于复杂。当你只是学习指针算术时,它们有一些价值作为例子,但这就是它们所有的好处。

你真正需要的只是

for(i = 0; i < 3; i++)
    printf("%i\n", ((int *) data)[i]);

您可以像其他答案一样引入额外的int *指针,以使您的代码更具可读性。但这取决于你。