尽管有 const 限定符声明,为什么嵌套结构成员会发生变化?
Why nested structure member get alter despite const qualifier declaration?
尽管我的 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;
}
唯一的方法是将结构 base_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
限定符声明,但我观察到嵌套结构成员发生改变,我可以知道任何方法来避免嵌套结构成员在函数内部发生改变吗?
代码
#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;
}
唯一的方法是将结构 base_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;
};