繁体   English   中英

C铸造从uint32_t *到void *

[英]C casting from uint32_t* to void *

我有一个关于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
}

这些都是一样的吗?

谢谢

就像现在一样,这些方法都不会编译。 由于buffer是一个void* ,因为它具有未知的大小,所以不能对其进行算术运算。

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

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

编辑:

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

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

一种方法是:

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

我不明白你是什么意思

 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);
}

大编辑:

在WAY1

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

但在方式2你添加+ i offcet与void *缓冲区仍然整个结果是无效*然后你正在访问该值... 这是完全错误..你会收到警告/错误在这里

 warning: dereferencing ‘void *’ pointer

还有一个编辑:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM