Почему вложенный член структуры изменяется, несмотря на объявление квалификатора const? - PullRequest
2 голосов
/ 09 февраля 2020

Я наблюдал, как измененный элемент вложенной структуры изменяется несмотря на мое объявление 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;
}

Ответы [ 2 ]

3 голосов
/ 09 февраля 2020

Единственный способ сделать это - сделать элемент структуры base_data как const

2 голосов
/ 09 февраля 2020

Для начала в объявлении этой функции

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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...