C铸造从uint32_t *到void *

时间:2011-11-17 05:10:24

标签: c pointers function-pointers

我有一个关于C的指针转换的问题。

如果我有一个带有此签名的函数:

uint8_t input_getc(void)

从STDIN读取用户输入。

然后我有一个指针

void* buffer

我存储了来自input_getc()的返回值。什么是正确的投射方式?

//read user input
for(i = 0; i < SIZE; ++i)
{
    uint8_t temp = input_getc();

    //copy to void* buffer
    *(uint8_t *)(buffer + i) = temp //WAY #1
    *(buffer + i) = (void *)temp;   //WAY #2
}

这两个都一样吗?

由于

3 个答案:

答案 0 :(得分:8)

就像现在一样,这些方法都不会编译。由于buffervoid*,因此您无法对其进行算术运算,因为它的大小未知。

目前还不完全清楚你要在哪里存储它。如果您只是尝试将uint8_t存储到buffer指向的内存位置且偏移为i,那么可以这样做:

((uint8_t*)buffer)[i] = temp;

编辑:

好的,显然在C中允许void*算术,但在C ++中不允许。但是,这样做仍然被认为是不安全的行为。

请参阅此问题:Pointer arithmetic for void pointer in C

答案 1 :(得分:2)

一种方法是:

*(((uint8_t*)buffer)+i) = temp;

答案 2 :(得分:2)

我不明白你是什么意思

 copying to  `void* buffer`

但如果您正在做以下事情,那么way1是正确的

int main()
{
    int i;
    char a[10];
    void *buffer;
    buffer = &a;   // buffer is void* type pointer and its pointing to some buffer then
    for(i = 0; i < 10; ++i)
    {
        uint8_t temp = 65;

        //copy to void* buffer
        *(uint8_t *)(buffer + i) = temp; //WAY #1

    }
    printf("\n %s",a);
}

BIG编辑:

IN WAY1

你正在添加+ i offcet with void * buffer并且仍然整个结果是无效的*然后你用uint8_t *对整个结果进行类型转换然后访问该值以便它可以工作

但是在路上2 你正在添加+ i offcet with void * buffer仍然整个结果是void *然后你正在访问那个值...... 这是完全错误的.. 你会收到警告/错误

 warning: dereferencing ‘void *’ pointer

另一个编辑:

你不能取消引用void *指针但你可以用指针值(而不是它的pointe值)进行算术运算

相关问题