2011-03-07 71 views
5

我想出在C下述溶液中逆转的字符串:反向用C溶液中的字符串段错误

#include <stdio.h> 

void reverse(char * head); 

void main() { 

    char * s = "sample text"; 
    reverse(s); 
    printf("%s", s); 
} 

void reverse(char * head) { 

    char * end = head; 
    char tmp; 

    if (!head || !(*head)) return; 

    while(*end) ++end; 

    --end; 

    while (head < end) { 
    tmp = *head; 
    *head++ = *end; 
    *end-- = tmp; 
    } 
} 

但是我的解决方案是段错误。根据GDB,违规行如下:

*head++ = *end; 

在while循环的第一次迭代中的行段错误。终点指向字符串“t”的最后一个字符,头指向字符串的开头。那么,为什么这不起作用呢?

+1

在末尾添加 '\ 0'。 – malinois 2011-03-07 13:20:39

+5

的\ 0,因为你把一个解释是在字符串 – Erik 2011-03-07 13:22:28

回答

32

变化

char * s = "sample text"; 

char s[] = "sample text"; 

“样本文本” 是一个字符串,其可驻留在读只是你的地址空间的一部分。使用数组语法确保将此字符串复制到可写的堆栈中。

+1

Upvoting你,而不是codaddict的一致答案是自动的。 – JeremyP 2011-03-07 13:24:44

+0

非常有趣的..感谢您的解释。 – Sam 2011-03-07 13:34:41

+0

也许稍微偏离主题,但什么是具有只读存储器“示例文本”的好处?为了节省空间? – Jeff 2011-03-09 22:43:30

11

s指向一个字符串:

char * s = "sample text"; 

在功能reverse你试图修改字符串常量导致不确定的行为。

为了解决这个问题使s字符数组:

char s[] = "sample text";