如何在C中设置和更改常量变量/结构/指针的值?

问题描述 投票:1回答:2

在.h文件中

typedef enum
{A1,A2}struct_A;

typedef struct
{const struct_A G;} struct_B;

typedef struct
{const struct_B * F;} struct_C;

typedef struct
{const struct_C *E;} struct_D;

在.c文件中

const struct_D temp;

如何设置/更改值:

temp->E[i].F[0].G
c pointers struct constants
2个回答
2
投票

将值设置为const结构的唯一方法是在声明它时初始化它。所以,解决方案是:

struct_B B = {A1}; 
struct_C C = {&B};  
struct_D temp = {&C};

但是,我没有遇到任何需要这种嵌套的const结构的场景。


0
投票

起初:如果我们看到一些合格的const,我们应该认真对待并避免抛弃常量。如果丢弃全局或静态数据的const限定符,则会得到未定义的行为,并且您将在linux中获得分段错误。

一般来说,正确的方法是Suven Pandey在另一个答案中指出的方法。

但是,有一些有效的案例可以抛弃const。您的案件可能有资格作为https://wiki.sei.cmu.edu/confluence/display/c/EXP05-C.+Do+not+cast+away+a+const+qualification的例外之一

EXP05-C-EX3:因为const表示“只读”而不是“常量”,所以当用户尝试以某种方式更改它时,将struct成员声明为(指向)const对象以获取诊断信息有时很有用。而不是通过专门设计来维护该数据类型的功能。但是,在这些功能中,可能需要剥离const限定以更新这些成员。

当数据位于可堆叠的内存区域(如堆栈或堆)时,我们可以抛弃const。无论如何,我们需要小心,因为如果代码中继该数据是不可变的并且我们更改它,则可能会产生意外行为。

所以,这就是你要求的:

typedef enum {A1, A2} enum_A;
typedef struct { const enum_A G; } struct_B;
typedef struct { const struct_B * F; } struct_C;
typedef struct { const struct_C *E; } struct_D;

int main() {
   const struct_B b = {A1};
   const struct_C c = {&b}; 
   const struct_D temp = {&c};
   enum_A *pointer_to_non_const_A = &temp.E[0].F[0].G;
   *pointer_to_non_const_A = A2;
}

但这取决于temp的定义位置,并将导致编译警告。如果temp是一个将崩溃的全球性。以下是工作时的情况,但不得使用,崩溃时:

#include <stdlib.h>

const int global_in_data_segment = 0;

int main() {
    const int in_stack = 0;
    static const int static_in_data_segment = 0;
    const int *in_heap = malloc(sizeof(int));

    int *works;
    works = &in_stack; *works = 1;
    works = in_heap; *works = 2;

    int *crashes;
    crashes = &global_in_data_segment; *crashes = 3;
    crashes = &static_in_data_segment; *crashes = 4;
}

为了完整起见,c ++有const_cast:https://en.cppreference.com/w/cpp/language/const_cast

© www.soinside.com 2019 - 2024. All rights reserved.