简单的字符串反转函数为什么会有段错误呢?

来源:百度知道 编辑:UC知道 时间:2024/05/25 08:33:48
char *str_rev(char *str)
{
int n = strlen(str);
printf("n==%d\n",n);
int i;
char tmp;
for(i = 0;i < n/2; i++)
{
tmp = str[i];
str[i] = str[n-i-1];/* 在这儿出错的段错误! */
str[n-i-1] = tmp;
}
return str;
}

不知道为什么这么简单的反转函数出现了段错误,感觉应该没错误啊?
大家看一下!
我是在Linux下gcc编译的。
是这个的原因!
我用的是
char *s1 = "hello";
str_rev(s1);
就会有段错误!~~?????为何?
若如下:
char s1[] = "hello";
str_rev(s1);
这样就OK了!

是char *s1="hello",也有段错误啊~

char *p3="123456"; //123456\0在常量区,p3在栈上。

试图改变常量区的变量,会出错或者崩溃。

参考资料:
首先要搞清楚编译程序占用的内存的分区形式:
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于

数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据

结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态

变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统

释放。
4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
5、程序代码区
这是一个前辈写的,非常详细
//main.cpp
int a=0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b;栈
char s[]="abc"; //栈
char *p2; //栈
char *p3="123456"; //123456\0在常量区,p3在栈上。
static int c=0; //全局(静态)初始化区
p1 = (char*)malloc(10);
p2 = (char*)malloc(20); //分配得来得10和20字节的区域就在堆区。
strcpy(p1,"123456"); //123456\