将(ptr到const)转换为(ptr到uint8)

时间:2015-03-31 22:34:41

标签: c embedded

有没有办法在" 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

2 个答案:

答案 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的对象是未定义的行为,因此请小心。