我正在编写一本书中的一个例子来编写一个函数来反转C中的字符串。 这是以下问题。但是当我使用gcc在ubuntu下执行它时。我得到一个段错误。 我试过调试它,但我不明白这行怎么可能'* start ++ = * end;'造成段错误。
我感谢有人可以帮我理解seg错误。
#include <stdio.h>
#include <stdlib.h>
void myreverse(char* str) {
int len = strlen(str);
char tmp;
char* start = str;
char* end = str + (len -1);
while (start < end) {
tmp = *start;
// this is causing Segmentation fault
*start++ = *end;
*end-- = tmp;
}
}
int main(void) {
char* test = "Hello World";
puts(test);
myreverse(test);
puts(test);
return EXIT_SUCCESS;
}
答案 0 :(得分:1)
字符串文字存储在可执行文件的只读部分中。您可以通过将char* test = "Hello World";
更改为char test[] = "Hello World";
来避免这种情况,其中"Hello World"
将被复制到数组测试中。
答案 1 :(得分:0)
您的字符串缓冲区是只读内存。字符串文字无法修改。
使用strcpy或strdup创建可写内存缓冲区。
char* test = strdup("Hello World");
请记住在完成后释放字符串。
答案 2 :(得分:0)
char* test = "Hello World";
这是一个字符串文字。这是只读的;你不能修改它。
您正在尝试修改它:)
答案 3 :(得分:0)
请在此处查看答案:Modifying a C string: access violation
基本上C字符串文字是只读的,不能写入。
答案 4 :(得分:0)
char* test = "Hello World";
当你动态地给字符指针赋一个字符串时,你给出的字符串会被保存在数据段的只读部分中。然后你将这个地址传递给myReverse函数,在那里你试图改变那个位置的内容在行
*start++ = *end;
导致分段错误..
只需更改此行
即可char* test = "Hello World";
到
char temp[] = "Hello world";
char *test = temp;
并且它不会崩溃。有关详细信息,请参阅this主题..
答案 5 :(得分:0)
根据我的经验,当您尝试访问变量范围之外的内存位置时会发生seg错误。 C没有任何边界检查,所以我猜你代码中的某个地方(* start ++)正在递增一个指向你未在代码中保留的内存位置的指针。您不能只遍历代码中未分配的内存位置,因为这可能会干扰正在用于其他目的的数据,并会产生意外结果。