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

Changing constant memory content through non-const pointers in C

假设我在 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;

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

它就是这样做的,仅此而已:

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

所以当你通过取消引用使用它时,你实际上是在读取 from/writing 到一块随机的内存,它是否崩溃是随机的。

改写这个会起作用:

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;

而且您无法再修改任何内容。