通过 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;
而且您无法再修改任何内容。
假设我在 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;
而且您无法再修改任何内容。