【问题标题】:Why nested structure member get alter despite const qualifier declaration?尽管声明了 const 限定符,为什么嵌套结构成员会发生变化?
【发布时间】:2020-05-25 01:36:30
【问题描述】:

尽管我声明了const 限定符,但我观察到嵌套结构成员发生了变化,我可以知道有什么方法可以避免嵌套结构成员在函数内发生变化吗?

代码

#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;
}

【问题讨论】:

  • 如果不将成员设为const,您将无法做到这一点。

标签: c struct malloc free


【解决方案1】:

这样做的唯一方法是将结构base_data 的成员设为const

【讨论】:

    【解决方案2】:

    对于此函数声明中的初学者

    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;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 2020-01-06
      相关资源
      最近更新 更多