马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *reverse_str(char *str){
char *start = str;
char *end = str+strlen(str)-1;
char ch;
if(str != NULL){
while(start < end){
ch = *start;
*start++ = *end;
*end-- = ch;
}
}
return str;
}
int main()
{
char * str = "ABC";
printf("original ::%s\n", str);
str = reverse_str(str);
printf("reverse ::%s\n", str);
return 0;
}
本帖最后由 风扫地 于 2018-3-22 17:49 编辑
1.char * str = "ABC";
这里开辟了"ABC"的空间,并且让str指针指向他,部分编译器会把“ABC”分配在静态区,只让读不让写,而你在reverse_str函数中用start 指针指向了"ABC"并且对这部分区域进行了写操作,涉及读写权限问题,不同环境不同编译器有不同规定比如你用的gcc编译出来就不让读,我用lcc编译又可以运行出结果,限于个人能力,无法展开叙述。
2.如果我们确定某段字符串只会用来读的时候,通常可以用char * str = "ABC";
如果我们不确定某段字符串只会用来读的时候,一般用字符数组存放,比如你这里可以这样定义:
char str[4] = "ABC";
此时 “ABC”分配在局部变量对应的栈中或者全局变量区中,可读可写。。不如改下试试
参考: https://www.cnblogs.com/silence-hust/p/4487026.html
(1)错误的访问类型引起
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *c = "hello world";
c[1] = 'H';
}
上述程序编译没有问题,但是运行时弹出SIGSEGV。此例中,”hello world”作为一个常量字符串,在编译后会被放在.rodata节(GCC),最后链接生成目标程序时.rodata节会被合并到text segment与代码段放在一起,故其所处内存区域是只读的。这就是错误的访问类型引起的SIGSEGV。
|