LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1343|回复: 9

C/C++中如何防止字符串在函数调用时被修改?

[复制链接]
发表于 2006-5-9 11:56:03 | 显示全部楼层 |阅读模式
这个字符串用一个char *  str 指向,且要求把str作为实参传递给一个函数 ,如何防止str指向的字符串被窜改? 比如下面设计的foo() 和 bar() 均没办法防止。 请教熟悉C/C++的高手,谢谢!


  1. #include <iostream>
  2. using namespace std;

  3. void foo(const char * str)
  4. {
  5.     char * p=(char*)str;
  6.     p[0]='H';
  7. }

  8. void bar(const char * const str)
  9. {
  10.     char * p=(char*)str;
  11.     p[1]='E';
  12. }

  13. int main()
  14. {
  15.     char str[]="hello";
  16.     cout<<str<<endl;
  17.     foo(str);
  18.     cout<<str<<endl;
  19.     bar(str);
  20.     cout<<str<<endl;
  21.     return 0;
  22. }
复制代码


  1. ~/coding/test/cpp $  g++ a2.cc
  2. ~/coding/test/cpp $  ./a.out
  3. hello
  4. Hello
  5. HEllo
复制代码
发表于 2006-5-9 12:01:50 | 显示全部楼层
应该不可能吧

同一个程序里面不可能防止住故意的行为。都是同一个用户,对内存读写的权限总是一样的。要是想修改,怎么写程序也没用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-9 12:10:41 | 显示全部楼层
其实我的意思就是防止多人合作的时候不小心造成窜改。
比如我给你一个接口参数,你来编写实现,但是不允许窜改我的字串。即使你很小心,但难免意外造成窜改。那么有什么好的机制来实现? 比如 ,我给出的foo() bar()从函数参数声明上虽然起到一定作用,但毕竟没法完全保证。
回复 支持 反对

使用道具 举报

发表于 2006-5-9 12:15:13 | 显示全部楼层
const已经可以防止无意的修改。
本来强制转换指针类型就不是什么好的编程习惯。这点上我觉得强调好的代码风格比较重要。
回复 支持 反对

使用道具 举报

发表于 2006-5-9 12:53:14 | 显示全部楼层
老兄,机器是不会知道 const 有什么意义的,const 的含义是人加上去的。C/C++ 这样的“透明的”编译型语言应该是没有保护机制的。
回复 支持 反对

使用道具 举报

发表于 2006-5-9 12:53:26 | 显示全部楼层
如果用C++的话,推荐在转换的时候使用C++ casting operators:
static_cast<>();
dynamic_cast<>();
reinterpret_cast<>();
const_cast<>();
使用C++ casting operators的话,只有const_cast<>()能将const转成non-const。虽然仍然无法完全避免const到non-const的转换,但至少使程序员能够更明白自己在做什么。

从另一方面,C/C++的设计初衷就是相信程序员,也就是不防止程序员做任何事情。连mutable这种东西都出现了,更何况把const转换成non-const呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-9 13:18:19 | 显示全部楼层
谢谢大家的答复!
回复 支持 反对

使用道具 举报

发表于 2006-5-9 15:17:03 | 显示全部楼层
同意 Woolzey 兄的观点. 人的因素永远比机器的因素要大.
回复 支持 反对

使用道具 举报

发表于 2006-5-9 18:13:02 | 显示全部楼层
有一个方法, 就是你传给他的参数, 是一个副本,不是你实际的参数,

类似于值传递,

不过这个好像不符合你的初衷
回复 支持 反对

使用道具 举报

发表于 2006-5-9 19:32:19 | 显示全部楼层
要是每次都传递副本, 那干脆不要用 C 好了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表