C铸造从uint32_t*到void*

Hun*_*len 4 c pointers function-pointers

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

如果我有这个签名的功能:

uint8_t input_getc(void)

从STDIN读取用户输入.

然后我有一个指针

void* buffer

我存储来自input_getc()in的返回值.什么是正确的方法来投射它?

//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
}
Run Code Online (Sandbox Code Playgroud)

这些都是一样的吗?

谢谢

Mys*_*ial 8

就像现在一样,这些方法都不会编译.因为它buffer是一个void*你不能做算术,因为它有一个未知的大小.

目前还不完全清楚你要在哪里存储它.如果你只是想把它存储uint8_tbuffer带有offset 的内存位置i,那么就可以这样做:

((uint8_t*)buffer)[i] = temp;
Run Code Online (Sandbox Code Playgroud)

编辑:

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

看到这个问题:C中的空指针的指针算法

  • @ Mr.32,标准指针算法只允许"指向对象类型的指针",这是与"不完全类型"相反的标准术语.`void*`被明确定义为指向不完整类型的指针.其原因很简单,字节增量是多少?1(作为`char`)或平台最方便的字大小?所以不,对于标准C,这是未定义的行为,但gcc(以及一些gcc像衍生物)接受这个作为扩展. (2认同)