c - 如何在 C 中初始化堆中的只读内存位置?

标签 c

考虑以下代码:

#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/

相关文章:

java - JNI 中的二维数组

c - 有效地将无符号转换为有符号

c - IFF_UP 和 IFF_RUNNING 有什么区别?

c - 总线错误 : 10 in C dealing with struct pointers

c - Linux内核如何处理异步I/O(AIO)请求?

对 DLL 和 WM_QUERYENDSESSION 中的 CTRL_SHUTDOWN_EVENT 处理感到困惑

c - mergesort : no errors and warnings when compile and link, 但输出不按顺序

c - 我想要的Yacc规则并没有减少

c - 排序数组 union 的中位数 - 递归结束后做什么

.net - 我想弹出我自己的对话框(在服务器上保存文件而不询问目标路径位置)而不是 adobe 的另存为对话框