在C中使struct fiels const

时间:2016-04-24 12:27:51

标签: c++ c pointers struct const

给出一个结构:

%spark.r
.z.get("myDF")

是否可以将其转换为struct not_const { int a; char *b; } nc; 的const版本?:

not_const

可能有任何填充问题吗? 我听说透明联合,但我认为它们仅用于函数参数。

谢谢。

3 个答案:

答案 0 :(得分:2)

类型不同,并且不兼容。代码违反了严格别名。

编译器可以在struct成员之间添加不同数量的填充。

如果你想让const成员使用原始的struct定义并使用指向const的指针:

const struct not_const* c = ( const struct not_const* )&nc;

此行将导致编译器错误:

c->a = 123;

答案 1 :(得分:0)

另一个答案的问题是数据仍然可以修改 通过其他机构。

const struct not_const* c = ( const struct not_const* )&nc;
nc->a=some_other_value; // will still change the data.

一种解决方案是为c分配一些内存并将nc复制到其中。

non_const obj1;
printf("Enter non_const int : ");
scanf("%d",&obj1.a);
obj1.b="SomeString"; 

/* Declare a const version */
const non_const *obj3;
/* Allocate the memory */
obj3=malloc(sizeof(obj1);
/* Copy the first object */
memcpy(obj3,&obj1,sizeof(obj1)); 
/* You may see a warning: passing argument 1
 * of ‘memcpy’ discards ‘const’ qualifier from pointer target type 
 * which can be neglected if i am not mistaken
 */

答案 2 :(得分:-1)

我不认为constness对对齐有一些担忧。在二进制级别,这些类型是兼容的。如果你愿意,你可以这样做(这是用C编写的很多东西的工作原理 - 很多网络代码,sockaddr_in / sockaddr_in6 - 你可以根据需要检查头文件)。但正如其他人所说的那样,拥有nc const *你的变量/参数会更好,它最终将使您免于严格引用规则违规。