问题描述
|
#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\";