给出一个结构:
%spark.r
.z.get("myDF")
是否可以将其转换为struct not_const {
int a;
char *b;
} nc;
的const版本?:
not_const
可能有任何填充问题吗? 我听说透明联合,但我认为它们仅用于函数参数。
谢谢。
答案 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 *你的变量/参数会更好,它最终将使您免于严格引用规则违规。