将const char *转为char *时候是不是一定报错

wwkevin811 2010-12-16 11:35:28
首先不要讨论该不该转!
我的问题是:当
void B (char*);
int A (const char * c){
B((char *) c);
}

是不是一定报错。?今天我碰到一个程序没有发生编译错误。。。这个是什么导致的?
...全文
282 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
CJBAAA 2010-12-17
  • 打赏
  • 举报
回复
正解在此
[Quote=引用 3 楼 bluejays 的回复:]
c/c++编译器还是比较信任程序员的。
如果没有强制转换,编译器会报错。
他见到了强制转换,就认为程序员已经知道这里有潜在的问题,既然程序员不怕,编译器也就不管了。
[/Quote]
bluesky12312388 2010-12-17
  • 打赏
  • 举报
回复
[code=C/C++]
void B (char*);
int A (const char * c){
B((char *) c);
}
//是什么导致的,是这句 (char*)c =>const_cast<char *>(c);
//编译器当然不会报错
/code]
Huppert 2010-12-17
  • 打赏
  • 举报
回复
编译的时候不会报错,但是如果c指向的是只读内存,那么就会报运行时错误,如果c指向不是只读内存,这不会有任何问题。请参考下面的例子
#include <stdio.h>
#include <stdlib.h>

void B (char*c)
{
c[0]='b';
}
int A (const char * c){
B((char *) c);
return 0;
}


int main(void)
{
const char *c = "abcdefg";
char d[]="higklmn";
char *e="opqrst";
A(c);//错误
A(d);//正确
A(e);//错误
system("pause");
return 0;
}
  • 打赏
  • 举报
回复
强转理论上不会报错,但是会有提示warning,如果在运行时改变了原有字符串的内容,那么就会出现段错误,或其他导致程序终止。
luciferisnotsatan 2010-12-17
  • 打赏
  • 举报
回复
强转了应该就不会报错了
wyfwx 2010-12-17
  • 打赏
  • 举报
回复
当然报了,不然编译器就有问题了
龙哥依旧 2010-12-17
  • 打赏
  • 举报
回复
不是~
Huppert 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hbuxiaoshe 的回复:]
引用 11 楼 wwkevin811 的回复:

引用 8 楼 whhlpo 的回复:

编译的时候不会报错,但是如果c指向的是只读内存,那么就会报运行时错误,如果c指向不是只读内存,这不会有任何问题。请参考下面的例子
C/C++ code
#include <stdio.h>
#include <stdlib.h>

void B (char*c)
{
c[0]='b';
……
[/Quote]
正解
Metrosexual 2010-12-17
  • 打赏
  • 举报
回复
调试下不就知道了!
matrixcl 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 matrixcl 的回复:]
看你在void B (char*)里面做什么了。要是修改了指针指向内容,肯定报错
[/Quote]
这个回答有误哈。

8楼列举了几种情况,试图修改常量区的内存会报错,但是但修改常量是正确的,而且可以成功的


#include <stdio.h>
#include <stdlib.h>

void B (char*c)
{
c[0]='b';
}
int A (const char * c){
B((char *) c);
return 0;
}


int main(void)
{
//const char *c = "abcdefg";
//char d[]="higklmn";
//char *e="opqrst";
const char f[]="higklmn";
//A(c);//错误
//A(d);//正确
//A(e);//错误
A(f);//正确
printf(f);
system("pause");
return 0;
}


hbuxiaoshe 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wwkevin811 的回复:]

引用 8 楼 whhlpo 的回复:

编译的时候不会报错,但是如果c指向的是只读内存,那么就会报运行时错误,如果c指向不是只读内存,这不会有任何问题。请参考下面的例子
C/C++ code
#include <stdio.h>
#include <stdlib.h>

void B (char*c)
{
c[0]='b';
}
int A (const char * c)……
[/Quote]

D正确,是因为d指向的不是只读数据,是可修改的,但不能在函数A()里修改,A可通过调用B()来修改。B做了什么,A应该不会知道。
E错误,是因为e指向的是字符常量,是不可修改的。
matrixcl 2010-12-17
  • 打赏
  • 举报
回复
看你在void B (char*)里面做什么了。要是修改了指针指向内容,肯定报错
wwkevin811 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 whhlpo 的回复:]

编译的时候不会报错,但是如果c指向的是只读内存,那么就会报运行时错误,如果c指向不是只读内存,这不会有任何问题。请参考下面的例子
C/C++ code
#include <stdio.h>
#include <stdlib.h>

void B (char*c)
{
c[0]='b';
}
int A (const char * c){
B((char *) c);
retu……
[/Quote]

这个为什么是D正确,E错误
bluejays 2010-12-16
  • 打赏
  • 举报
回复
c/c++编译器还是比较信任程序员的。
如果没有强制转换,编译器会报错。
他见到了强制转换,就认为程序员已经知道这里有潜在的问题,既然程序员不怕,编译器也就不管了。
bluejays 2010-12-16
  • 打赏
  • 举报
回复
既然用了强制转换,编译就不会报错啦。
sduxiaoxiang 2010-12-16
  • 打赏
  • 举报
回复
char* d = c;会error
这样可以啊

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧