#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);
}
答案 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");