gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:44:10 26 4
gpt4 key购买 nike

考虑以下代码:

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com