返回信息流写了一个简单的字符串反转程序:
void reverse(char* str)
{
if(!str)
return;
if(*str=='\0' && *(str+1)=='\0')
return;
int len = strlen(str);
char* q = str+len-1;
char* p = str;
while(p<q)
{
char temp = *p;
*p = *q;
*q = temp;
p++;
q--;
}
}
如果是如下输入:
char* str = "abcd";
reverse(str);
程序会崩溃,我想问问大家,在reverse函数里除了异常机制,有没有办法检测输入是个常量指针呢?
ps: char* str = "abcd"; //str本身是个常量指针,编译器为啥不把它当成常量指针处理呢
这是一条镜像帖。来源:北邮人论坛 / cpp / #79988同步于 2014/5/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于常量指针
xiaobing307
2014/5/27镜像同步18 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
str本身不是常量指针,根据你的声明,他只是一个普通的指针而已.
你把char* str = "abcd"; 改成 const char* str = "abcd";
看看把str传给reverse 编译会不会有错.
根据声明只是一个普通的指针,可是并不能改变它指向的内容,实质上不应该是一个常量指针么
改成 const char* str = "abcd"; 编译通不过,无法由const char* 转成 char*
【 在 buptxrc 的大作中提到: 】
: str本身不是常量指针,根据你的声明,他只是一个普通的指针而已.
: 你把char* str = "abcd"; 改成 const char* str = "abcd";
: 看看把str传给reverse 编译会不会有错.
嗯,确实不是好的习惯。不过我想问一下,有没有可能在函数内部处理这种情况,使程序不崩溃。
【 在 zx723 的大作中提到: 】
: char* str = "abcd";
: 这并不是一个好的编程习惯,编译器之所以允许你这么作,只是因为历史原因。。。
所以我觉得问题在于 char* str = "abcd";
而不是在于 把str传递给了函数......
只要编译器哪天不让程序猿把字符串常量赋值给一个非常量指针就好了= =!
【 在 xiaobing307 的大作中提到: 】
: 根据声明只是一个普通的指针,可是并不能改变它指向的内容,实质上不应该是一个常量指针么
: 改成 const char* str = "abcd"; 编译通不过,无法由const char* 转成 char*
【 在 xiaobing307 的大作中提到: 】
: 根据声明只是一个普通的指针,可是并不能改变它指向的内容,实质上不应该是一个常量指针么
: 改成 const char* str = "abcd"; 编译通不过,无法由const char* 转成 char*
函数的参数改成 const char* 了吗?
void reverse(const char* str)
【 在 xiaobing307 的大作中提到: 】
: 嗯,确实不是好的习惯。不过我想问一下,有没有可能在函数内部处理这种情况,使程序不崩溃。
我目前能想到的是,你注册一个SIGSEGV的信号处理函数,这样,当你写const char*时,就可以自己处理一下了。
或者,你自己判断一下这个指针指向的内存区域是不是在.rodata section里。。。
函数要反转指向的内容,不能设成const char*啊
【 在 kizy008 的大作中提到: 】
:
: 函数的参数改成 const char* 了吗?
: void reverse(const char* str)