Coredump在处理反转字符串的函数时

时间:2011-04-20 05:25:18

标签: c string reverse

#include  <stdio.h>
#include  <string.h>

main()
{
    char tmpChar;
    char *str_1 = "Hello";

    int index;
    int len = strlen(str_1);
    for (int i = 0; i < len/2; i++)
    {
        index = len - 1- i;
        tmpChar = str_1[len - i -1];
        str_1[index] = str_1[i]; <<<<<--------------- core dumps at this point. Not sure why
        str_1[i] = tmpChar;
        printf("str_1[%d] = %c\n", i, str_1[i]);
    }
    str_1[len] = '\0';
    printf("str_1 = %s\n", str_1);
}

3 个答案:

答案 0 :(得分:5)

您正在尝试修改调用未定义行为的字符串文字的内容。字符串文字通常存储在内存的只读部分,并具有静态存储持续时间。

char *str_1 = "Hello";。在这种情况下,"Hello"是一个字符串文字(存储在只读部分),你试图通过这样做修改内容

str_1[index] = str_1[i];

而不是使str_1指向文字的指针[即char *str_1 = "Hello"]使其成为一个字符数组,即char str_1[] = "Hello"。文字的内容将被复制到堆栈中,如果您尝试修改内容,则不会出现任何段错误。

答案 1 :(得分:3)

更改

char *str_1 = "Hello"; //read only

作为

char str_1[] = "Hello";

答案 2 :(得分:1)

ISO C99标准对字符串文字有这样的说法(第6.4.5 / 6节):

  

如果这些数组的元素具有不同的数据,则未指定   适当的价值观如果程序试图修改这样的数组,则行为是   未定义。

这是因为,通常情况下,所有字符串文字都集中在一个可能被标记为只读的区域中,并且它们有时会合并以节省空间。换句话说,两个字符串文字:

char *p1 = "Googolplex";
char *p2 = "plex";

可以这样存储:

  +--- p1           p2 ---+
  |                       |
  V                       V
+---+---+---+---+---+---+---+---+---+---+----+
| G | o | o | g | o | l | p | l | e | x | \0 |
+---+---+---+---+---+---+---+---+---+---+----+

这意味着:不要试图修改它们。 可能在某些情况下工作,但如果你重视可移植性,那么你应该依赖它。

变化:

char *str_1 = "Hello";

为:

char str_1[] = "Hello";

因为这实际上与:

相同
char str_1[6];
strcpy (str_1, "Hello");