c - 'const' 的范围,用于保护 C 中结构的底层成员的指针

标签 c

指针声明中保护结构底层成员的“const”的范围是什么?

这是我的代码解释:

typedef struct {
    int member1;
    int member2;
}tInnerStruct;

typedef struct {
    tInnerStruct *struct1;
    tInnerStruct *struct2;
    tInnerStruct *struct3;
}tContainerStruct;

void function1(const tContainerStruct * ptr)
{
//  L1  |   L2   |  L3         => Up to which level 'const' protects ?
    ptr->struct1->member1 = 5;  // => Why is this legal?
                                //    Shouldn't 'const' protect this?
}

“const”限定符保护底层成员的级别最高? 似乎很明显

ptr->struct1

无法修改,struct2 和 struct3 也是如此,因为结构体的成员被标记为 const。但是 struct1、struct2 和 struct3 的所有成员都完全不受 'const' 修饰符的影响吗?

最佳答案

const 仅适用于它正在修改的声明部分。

所以:

int d;
int * const q = &d;
*q = 3;             /* OK, *q is not const */
q = NULL;           /* ERROR, q is const */
const int * p;
p = &d;             /* OK, p is not const */
*p = 3;             /* ERROR, *p is const */

constness 不会遍历它所应用的直接对象。 对于您的示例,const tContainerStruct 意味着 tContainerStruct 的每个成员都将是 const。假设我们定义:

typedef struct {
    tInnerStruct * const struct1;
    tInnerStruct * const struct2;
    tInnerStruct * const struct3;
}constant_tContainerStruct;

然后 constant_tContainerStruct 的行为就像您的 const tContainerStruct 一样。但是,由于 const 应用于指针成员,因此它对所指向的 tInnerStruct 没有影响,因此这些对象仍然是可修改的。

关于c - 'const' 的范围,用于保护 C 中结构的底层成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957470/

相关文章:

C语言错误输出...使用二维数组的pascal三角形

c - 命名管道如何识别客户端

根据时间创建消息宏

c++ - 未找到先前编译的可用 IPDB/IOBJ

c - C语言中的多管道( children 不停读)

c - 没有标签的 switch 语句代码

c - 使用 Fork() 将整数传递给子进程和父进程的 Linux 系统调用问题

c - 我应该如何在 C 结构中声明字符串?

c - '(' token 之前的解析错误

c - 数组大于分配?