在对字符串进行反转的函数上工作时,Coredump

|
#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);
}
已邀请:
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\");
您正在尝试修改调用未定义行为的字符串文字的内容。字符串文字通常存储在内存的只读部分中,并且具有静态存储持续时间。
char *str_1 = \"Hello\";
。在这种情况下,“ 7”是字符串文字(存储在只读部分中),并且您试图通过这样做来修改内容
str_1[index] = str_1[i];
而不是将“ 9”作为指向文字的指针[即[
char *str_1 = \"Hello\"
]使其成为字符数组,即
char str_1[] = \"Hello\"
。文字的内容将被复制到堆栈中,如果您随后尝试修改其内容,则不会出现任何段错误。
更改
char *str_1 = \"Hello\"; //read only
char str_1[] = \"Hello\";

要回复问题请先登录注册