首页 文章

打印void指针的值

提问于
浏览
4

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

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

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

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

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

什么是正确的打印方式?

2 回答

  • 6

    只需使用临时 int*

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

    请注意 void* 不需要's no explicit cast in the first line, because that',避免显式强制转换被认为是好的C风格 . 在循环中,我已经使用了这样一个事实:你可以索引到一个指向数组的指针,就像它是数组本身一样 .

  • 2

    由于指针算法不适用于 void * 指针,因此"formal" C中的原始尝试不正确 . 但是,一些编译器支持 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)));
    

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

    你真正需要的只是

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

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

相关问题