为什么嵌套结构成员在const限定符声明之外获得alter?

为什么嵌套结构成员在const限定符声明之外获得alter?,c,struct,malloc,free,C,Struct,Malloc,Free,尽管我声明了const限定符,我还是观察到嵌套结构成员get alter,请问有什么方法可以避免函数中嵌套结构成员get alter 代码 #include <stdio.h> #include <stdlib.h> struct middle_data { struct base_data *int_data_ptr; }; struct base_data { int value; }; void function( const struct

尽管我声明了
const
限定符,我还是观察到嵌套结构成员get alter,请问有什么方法可以避免函数中嵌套结构成员get alter

代码

#include <stdio.h>
#include <stdlib.h>

struct middle_data
{
    struct base_data *int_data_ptr;
};

struct base_data
{
    int value;
};

void function( const struct  middle_data const *middle_ptr)
{

    middle_ptr->int_data_ptr->value= 2; // how to forbid value get alter?

    struct base_data *ptr= middle_ptr->int_data_ptr;

    printf("ptr->value = %d\n",  ptr->value);
}

int main(int argc, char **argv)
{

   struct  middle_data *middle_data_ptr;

    middle_data_ptr = (struct  middle_data*)malloc(sizeof(*(middle_data_ptr)));

    middle_data_ptr->int_data_ptr =malloc(sizeof(*(middle_data_ptr->int_data_ptr)));

    middle_data_ptr->int_data_ptr->value=3;

    function(middle_data_ptr);

    printf("  middle_data_ptr->int_data_ptr->value = %d\n",    middle_data_ptr->int_data_ptr->value);

    free(middle_data_ptr);
    free(middle_data_ptr->int_data_ptr);
    return 0;
}
#包括
#包括
结构中间数据
{
结构基本数据*int数据\u ptr;
};
结构基础数据
{
int值;
};
void函数(常量结构中间值\u数据常量*中间值ptr)
{
middle\u ptr->int\u data\u ptr->value=2;//如何禁止value get alter?
结构基本数据*ptr=中间数据->内部数据\u ptr;
printf(“ptr->value=%d\n”,ptr->value);
}
int main(int argc,字符**argv)
{
结构中间数据*中间数据ptr;
middle_data_ptr=(struct middle_data*)malloc(sizeof(*(middle_data_ptr));
middle_data_ptr->int_data_ptr=malloc(sizeof(*(middle_data_ptr->int_data_ptr));
中间数据->内部数据->值=3;
功能(中间数据ptr);
printf(“中间数据->内部数据->值=%d\n”,中间数据->内部数据->值);
自由(中间数据);
自由(中间数据\u ptr->内部数据\u ptr);
返回0;
}

实现这一点的唯一方法是将结构的成员
base\u data
作为
const
作为此函数声明中的启动器

void function( const struct  middle_data const *middle_ptr)
一个限定符
const
是多余的。它们都意味着指向的对象是常量,而不是指针本身

因此,这个限定符
const
意味着指向对象的数据成员也是常量,事实上,您已经有了常量

struct base_data * const int_data_ptr;
也就是说,您有一个指向可能更改的非常量对象的常量指针

如果您不想更改指向的对象,那么必须声明如下结构

struct middle_data
{
    const struct base_data *int_data_ptr;
};

如果不将成员设置为
const
,则无法执行此操作。