考虑以下代码:
#include<stdio.h>
int main()
{
const char* c = malloc(1);
*c = 'a';
printf("%c\n",*c);
}
这段代码显然会抛出以下编译错误:
file1.c:7:3: error: assignment of read-only location ‘*c’
*c = 'a';
^
如何在堆内存中初始化一个常量变量?
最佳答案
首先,要明白没有“堆中的只读位置”这样的东西。堆是 100% 可写的。 malloc()
定义为返回 void *
。您可以写入由 malloc
返回的指针指向的数据。
但是接下来要理解的第二件事是 const
也不一定意味着“只读”。
有只读存储器这样的东西,它通常会被const
指针指向,如果(尽管有任何const
指针)你确实设法写入只读内存,你通常会得到某种异常。
但是您可以拥有由非 const
指针指向的只读内存,并且您可以拥有指向可写内存的 const
指针。
那么 const
的真正意思是“我保证不写入此内存”或“我声明我不打算写入此内存”,并附加规定“我希望如果我不小心尝试写入此内存,编译器会给我编译时错误。”
如果你有一个普通的 const
指针,你可以初始化它一次。你可以这样说
const str1[] = "hello";
和
const *str2 = "world";
即使稍后尝试更新字符串
*str1 = 'x'; /* WRONG */
或
*str2 = 'y'; /* WRONG */
会失败。 (您可以将此视为 const
限定数据的“初始化异常”。
但是正如您所发现的,对于您通过调用 malloc
初始化的 const
指针没有这样的异常。如果你想从malloc
中获取一些内存,并初始化一次,然后 promise 以后不修改它,如果你想让编译器为你强制执行这个 promise ,你不能直接执行,除非您使用评论和 klutt's answer 中描述的两指针解决方法.
关于c - 如何在 C 中初始化堆中的只读内存位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51072407/