在一个简单的c程序中解决seg故障

时间:2011-10-26 05:58:53

标签: c

我正在编写一本书中的一个例子来编写一个函数来反转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;
}

6 个答案:

答案 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 ++)正在递增一个指向你未在代码中保留的内存位置的指针。您不能只遍历代码中未分配的内存位置,因为这可能会干扰正在用于其他目的的数据,并会产生意外结果。