如何解决在C中修改const指针
我试图理解为什么以下代码可以编译并正常运行。我希望在data
中使用f
的任何赋值都不会编译为gcc错误assignment of member ‘i’ in read-only object
。是否存在某种例外,因为data.i
是动态分配的?
#include <stdio.h>
#include <stdlib.h>
struct a {
int *i;
};
void f(const struct a *data) {
data->i[0] = 55;
}
int main() {
struct a data;
data.i = malloc(2 * sizeof(int));
f(&data);
printf("%d\n",data.i[0]);
return 0;
}
解决方法
const
前面的 struct
将其设为只读。如果该结构包含指针成员,则这些指针本身将变为只读。不是他们所指的。
也就是说,const struct a
会使成员i
的行为与被声明为int *const i;
的情况相同,这意味着指针本身无法更改为指向其他位置。指向的数据仍然是读/写int
。
如果您想限制对函数内部i
的访问,则应使该函数带有一个const int*
参数,并将i
成员传递给该函数。
在下面的代码中,const
指示data
指向的内容未被修改。 data->i[0] = 55;
不会修改指针data->i
。而是该行代码修改了data->i
所指向的内存。允许这样做,因为指针.i
是int *
而不是const int *
。
struct a {
int *i;
};
void f(const struct a *data) {
data->i[0] = 55;
}
,
您不能修改i
,但可以修改i
引用的对象。
为防止这种情况,您需要:
struct a {
const int *i;
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。