2

我在维基百科上读过这个

    int main(void)
 {

    char *s = "hello world";
    *s = 'H';

 }

当包含此代码的程序被编译时,字符串“hello world”被放置在程序可执行文件中标记为只读的部分中;加载时,操作系统将它与其他字符串和常量数据一起放在内存的只读段中。执行时,将变量 s 设置为指向字符串的位置,并尝试通过变量将 H 字符写入内存,从而导致分段错误**

我不知道为什么将字符串放在只读段中。请有人可以解释一下。

4

5 回答 5

3

字符串文字存储在只读内存中,这就是它的工作原理。您的代码使用初始化的指针指向存储字符串文字的内存,因此您无法有效地修改该内存。

要在可修改内存中获取字符串,请执行以下操作:

char s[] = "hello world";

那么你很好,因为现在你只是使用常量字符串来初始化一个非常量数组。

于 2013-01-24T10:42:03.017 回答
3

两者之间有很大区别:

char * s = "Hello world";

char s[] = "Hello world";

在第一种情况下,s是指向您无法更改的内容的指针。它存储在只读内存中(通常在应用程序的代码部分中)。

在后一种情况下,您在读写内存(通常是普通 RAM)中分配一个数组,您可以对其进行修改。

于 2013-01-24T10:43:18.620 回答
2
  • 当您这样做时:char *s = "hello world";thens指向代码部分中的内存的指针,因此您无法更改它。

  • 当您这样做时:char s[] = "Hello World";thens堆栈的字符数组,因此您可以更改它。

如果您不希望在程序期间更改字符串,最好这样做:char const *s = ....;。然后,当您尝试更改字符串时,您的程序不会因分段错误而崩溃,它会出现编译器错误(这要好得多)。

于 2013-01-24T10:41:07.553 回答
0

首先对指针有一个很好的理解,我给UA做个简短的demo:

首先让我们逐行分析您的代码。让我们从主要开始

char *s = "Some_string";

首先,你声明了一个指向 char 变量的指针,现在 *s 是内存中的一个地址,如果你试图改变它的内存值,C 会踢你,这是非法的,所以你最好声明一个字符数组,然后分配s 到它的地址,然后改变 s。

希望你得到,它。如需进一步参考和详细了解,请参阅 KN King:C Programming A Modern Approach

于 2013-01-24T11:29:34.827 回答
0

根据语言定义,字符串文字必须以这样的方式存储,即它们的生命周期在程序的生命周期中延伸,并且它们在整个程序中都是可见的。

就字符串的存储位置而言,这意味着什么取决于实现;语言定义不要求将字符串文字存储在只读内存中,并且并非所有实现都这样做。它只是说尝试修改字符串文字的内容会导致未定义的行为,这意味着实现可以自由地做任何它想做的事情。

于 2013-01-24T15:43:56.653 回答