有没有办法在" C"将(ptr到const结构)转换为(ptr到uint8)
以下函数需要(ptr到uint8)
memcopy( (uint8 *) destination, (uint8 *) source , uint16 _size);
该函数打算将类型((ptr to const))的缓冲区复制到另一个缓冲区
我知道在C ++中我可能会使用const_cast来抛弃(删除)常量或波动。但C怎么样?
目前的案例如下: 说我有一个结构main_S
struct main_S {
strcut1 xxxx1
strcut2 xxxx2
strcut3 xxxx3
}
指向main_S strcut的指针是(ptrcnst_Main),它是指向const的指针。
我需要复制main_S的第二个元素(xxxx2) 所以我将做以下
strcut2 dest;
memcopy( (uint8 *) &destination, (uint8 *) ptrcnst_Main->xxxx2 , SizeOf(strcut2));
但这永远不会奏效。并且我一直有错误,我无法将ptr const转换为ptr-uint8
答案 0 :(得分:1)
<强>更新强>
我刚读了你的评论,它变得很奇怪......代码非常近似,但我会尝试解决你的问题。
strcut2 dest;
memcopy( (uint8 *)&dest, (uint8 *)&(ptrcnst_Main->xxxx2) , SizeOf(strcut2));
尝试在ptrcnst_Main->xxxx2
前添加&符号(&amp;)并像我一样放置parantheses。
通常,当您将数据从缓冲区复制到另一个缓冲区而不对源缓冲区应用任何更改时,您将变量声明为常量指针,因为它不会更改!它是源缓冲区。所以在这里,你的指针source
应该是const uint8 *source
。即使它是一个常量指针,你也可以读取里面的值。
将const
限定符放在不可变数据上(阅读&#34;不需要更改的数据&#34;)对您和您的每个同事来说都是一种很好的做法。
<强>结论强>
您不需要将任何内容从const
转换为非const
。仍然可以读取常量变量。
然而,我会回答您的原始问题:
有没有办法在&#34; C&#34;将(ptr到const)转换为(ptr到uint8)?
在C中,您只需按照以下方式进行投射:(type) variable
例如:
const char* c1 = malloc(sizeof(char) * 5);
char* c2 = (char*)c1; // cast is here
for (int i = 0; i < 5 ; i++) {
c2[i] = 'i';
}
printf("%s\n", c1);
但删除常量是一种非常糟糕的做法。如果它不变,通常是故意的。
注意:这个代码在很多方面都很糟糕,但为了演示目的,我保持简单。
答案 1 :(得分:0)
对于C,您使用常规的C样式转换来抛弃常量。例如:
void f(const int *src,int *dst,int n)
{
memcopy((uint8_t*)dst,(uint8_t*)src,n*sizeof(int));
}
请注意,实际写入最初声明为const的对象是未定义的行为,因此请小心。