分段写入string时出现错误

我正在尝试编写一个就地反转函数,并且几乎完全遵循在线代码,但运行以下程序会引发总线错误。 我是否将错误的parameter passing给reverse()?

void reverse(char *str) { char * end = str; char tmp; if (str) { while (*end) { ++end; } --end; while (str < end) { tmp = *str; *str++ = *end; *end-- = tmp; } } } int main() { char *s = "sample"; reverse(s); printf("%s\n"); return 1; } 

要知道发生了什么,你必须了解一个C程序的内存布局。

 char *s = "sample"; // Here the "sample" string is placed in // the read only memory of the Initialized Data segment. 

在这里,你不能修改数据。 “ s ”是一个char const (“sample”)的指针,你试图修改char const 。 这就是为什么你得到bus error错误。

  |Stack frame of main() | |char *s | |-------------------------------| |Stack frame of reverse() | |char *end | |char tmp | | | |-------------------------------| | | | | | | | | | | |-------------------------------| | | | HEAP | | | |-------------------------------| | | | UNINITIALIZED DATA (BSS) | | | |-------------------------------| | | | INITIALIZED DATA | | | |"sample" | | | | | |(Read Only)| (Read/Write) | |-------------------------------| | Text or Code Segment | | | |-------------------------------| 

更新下面的post是不相关的你的问题。 但是如果你知道C中所有variables的内存分配在哪里,那么你可以更好地编写代码。 下面的程序可以更好地理解C程序的内存布局。 我没有在图中包含函数的命令行参数,函数参数和返回值。 想要更新这篇文章的人可以将函数的命令行参数,函数参数和返回值添加到图中。

 |Stack frame of main() | |local_To_Main | | | #include <stdio.h> |-----------------------------------| #include <stdlib.h> |Stack frame of function1() | int gVariable1 = 100; |local_To_Function1 | int gVariable2; |iptr | char cstring[10] = "Hello"; | \ STACK | char* cptr = "Hello World"; |------\---------------|------------| void function1(void) | \ \|/ | { | \ | static int j = 5; | \ | int local_To_Function1; | \ ^ | int *iptr; | \ | | iptr = (int *) malloc(sizeof(int)); |------------\---------------|------| free(iptr); | HEAP \ --- | } | \---> |int| | | --- | int main(void) |-----------------------------------| { | | static int i; | UNINITIALIZED DATA (BSS) | int local_To_Main; |gVariable2(initialized to 0) | |i (initialized to 0) | |-----------------------------------| function1(); | | return 0; | INITIALIZED DATA | } | | |"Hello World" |gVariable1 =100 | | ^ |cstring="Hello" | | | |j=5 | | |---<---<---- cptr | |(Read Only) | (Read/Write) | |-----------------------------------| | Text or Code Segment | | | |-----------------------------------| 

你可能想要改变

 char *s = "sample"; //Pointer to string literal 

 char s[] = "sample"; // mutable copy of string literal 

尝试和修改string文字是未定义的行为,它们应该用作const char *


可能不相干,但一个build议,

当你做结束这样的事情时,你可能会想要把它*end--你所想象的那样。

以上可以

 (*end)-- 

要么

  *(end--) 

你需要掌握优先规则,以确保你所要的是正在发生的事情。

你的反向function是完全正确的。 只是你的主要function部分的一些东西:

  • 正如KarthikT所说,s应该是char[]而不是char*因为更改文字是不确定的。

  • 在你的printf函数中,你忘记把s作为参数。

  • return 0成功。 return 1是错误的。

所以新的主要应该是这样的:

 int main() { char s[] = "sample"; reverse(s); printf("%s\n", s); return 0; } 

输出:

 elpmas 
 char *str="sample"; 

这里的示例存储在只读存储器中,所以您不能对这些文字进行修改。

为了进行操作,您必须将文字存储在读写内存中。 下面的代码可以解决你的问题。

 #include<stdio.h> void reverse(char *str) { char temp,*end; for(end=str;*end;end++); end--; for(;str<end;temp=*str,*(str++)=*end,*(end--)=temp); } int main() { char str[]="sample"; //stored in read-write memory reverse(str); printf("%s\n",str); return 0; } 

输出:

 elpmas