我有一个关于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
}
这两个都一样吗?
由于
答案 0 :(得分:8)
就像现在一样,这些方法都不会编译。由于buffer
是void*
,因此您无法对其进行算术运算,因为它的大小未知。
目前还不完全清楚你要在哪里存储它。如果您只是尝试将uint8_t
存储到buffer
指向的内存位置且偏移为i
,那么可以这样做:
((uint8_t*)buffer)[i] = temp;
编辑:
好的,显然在C中允许void*
算术,但在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值)进行算术运算