【发布时间】:2010-07-12 12:52:55
【问题描述】:
我将一个指针 ptr 传递给一个函数,该函数的原型将它作为 const。
foo( const char *str );
这根据我的理解意味着它将无法更改ptr传递的内容。就像foo( const int i ) 的情况一样。如果foo() 试图改变i 的值,编译器会报错。
但在这里我看到它可以轻松更改ptr 的内容。
请看下面的代码
foo( const char *str )
{
strcpy( str, "ABC" ) ;
printf( "%s(): %s\n" , __func__ , str ) ;
}
main()
{
char ptr[ ] = "Its just to fill the space" ;
printf( "%s(): %s\n" , __func__ , ptr ) ;
foo( const ptr ) ;
printf( "%s(): %s\n" , __func__ , ptr ) ;
return;
}
在编译时,我只收到警告,没有错误:
warning: passing argument 1 of ‘strcpy’ discards qualifiers from pointer target type
当我运行它时,我得到一个输出而不是Segmentation Fault
main():它只是为了填充空间
foo(): ABC
main(): ABC
现在,我的问题是
1-原型中的const char *str 究竟是什么意思?
这是否意味着函数不能更改str 的内容?如果是这样,那么上面的程序怎么会改变值?
2-如何确保我传递的指针的内容不会改变?
从上述问题中的“指针内容”,我的意思是“指针指向的内存内容”,而不是“指针中包含的地址”。
编辑
大多数回复说这是因为strcpy 和C 隐式类型转换。但是现在我尝试了这个
foo( const char *str )
{
str = "Tim" ;
// strcpy( str, "ABC" ) ;
printf( "%s(): %s\n" , __func__ , str ) ;
}
这次的输出是,编译器没有警告
main():它只是为了填充空间
foo(): 蒂姆
main(): 只是为了填满空间
显然,str 指向的内存被更改为包含"Tim" 的内存位置,而它在foo() 中。虽然这次我没有使用strcpy()。const 不应该阻止这个吗?还是我的理解有误?
在我看来,即使使用const,我也可以更改内存引用和内存引用的内容。那有什么用呢?
你能给我一个例子,编译器会给我错误,我试图改变一个 const 指针吗?
感谢大家的时间和精力。
【问题讨论】:
-
this q+a 可以帮助你,基本上你也需要理解为什么
str="Tim"可以,而str[0] = something不会——重复破坏者没有抓住这个(幸运吗?) -
+1 表示指向其他线程的指针。这很有帮助,但不如所选答案那么多。如果您考虑原始问题的
strcpy部分,我认为这不是重复的。谢谢大家。