gpt4 book ai didi

通过 C 中的非常量指针更改常量内存内容

转载 作者:行者123 更新时间:2023-11-30 18:25:28 26 4
gpt4 key购买 nike

假设我在 C: 中声明此变量

const char*** const strings; 

现在如果我尝试这个:

printf("character is : %c \n",***strings);

**strings="hello";

printf("strings is %s \n", **strings);

printf("character is : %c \n",***strings);

有时,我会得到以下输出:

character is :
strings is hello
character is : h

但是有时我会遇到段错误,因为(我假设)指令

**strings="hello";

我认为你可以用C编写char* str = "hello";,使str指向一个不可修改的字符串“hello”。为什么这在我的情况下不起作用?谁能解释为什么它不总是给出相同的输出?

最佳答案

当你写下:

const char*** const strings;

您要求编译器分配一个指向字符串指针的指针。

它确实做到了这一点,仅此而已:

  • 它不会分配字符串或指向字符串的指针。
  • 它不会将值初始化为任何特定值。

因此,当您通过取消引用来使用它时,您实际上是在随机读取/写入一 block 内存,并且它是否崩溃是随机的。

写这个会起作用:

char* empty = "";
char** pointer = ∅
char*** strings = &pointer;

您的评论表明您不太熟悉 const 的工作原理,所以让我解释一下:

const char*** const strings;

不是完全只读的。它看起来像这样:

(constant pointer) -> (pointer) -> (pointer) -> (constant char)

因此您可以修改中间指针(*strings 和 **strings)。

如果您想要一个完全只读的指针,请编写以下内容:

const char const * string = "hello";
const char const * const * string_pointer = &string;
const char const * const * const * string_pointer_pointer = &string_pointer;

并且您不再可以修改任何内容。

关于通过 C 中的非常量指针更改常量内存内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28890589/

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