如果在不同的作用范围内重名,自然没有问题

返回指向临时变量的指针

  大家都知道,栈里面的变量都是临时的。当前函数执行完成时,相关的临时变量和参数就都被清除了。不能把指向

这些临时变量的指针返回给调用者,因为这样的指针指向的数据是随机的,会给程序造成不可预料的后果。

  下面是个错误的例子。

  char* get_str(void)

  {

  char str[] = {"abcd"};

  return str;

  }

  int main(int argc, char* argv[])

  {

  char* p = get_str();

  printf("%s\n", p);

  return 0;

  }

  下面这个例子则没有问题,大家知道为什么吗?

  char* get_str(void)

  {

  char* str = {"abcd"};

  return str;

  }

  int main(int argc, char* argv[])

  {

  char* p = get_str();

  printf("%s\n", p);

  return 0;

  }

  试图修改常量

  在函数参数前加上const修饰符,是给编译器做类型检查用的,编译器会禁止修改这样的变量。但这并不是强制的,

你完全可以用强制类型转换绕过去,一般也不会出什么错。

  而对全局常量和字符串而言,就算用强制类型转换绕过去,运行时仍然会出错。原因在于它们是放在.rodata里面的

,而.rodata内存页面是不能修改的。试图对它们进行修改是会引发内存错误的。

  下面这个程序在运行时会出错。

  int main(int argc, char* argv[])

  {

  char* p = "abcd";

  *p = '1';

  return 0;

  }

  误解传值与传引用

  在C/C++中,参数默认传递方式是传值的,即在参数入栈时被复制一份。在函数里修改这些参数,不会影响外面的调

用者。

  #include

  #include

  void get_str(char* p)

  {

  p = malloc(sizeof("abcd"));

  strcpy(p, "abcd");

  return;

  }

  int main(int argc, char* argv[])

  {

  char* p = NULL;

  get_str(p);

  printf("p=%p\n", p);

  return 0;

  }

  在main函数里,p的值仍然是空值。当然在函数里修改指针指向的内容是可以的。

  符号重名

  无论是函数名还是变量名,如果在不同的作用范围内重名,自然没有问题。但如果两个符号的作用域有交集,如全

局变量和局部变量,全局变量与全局变量之间,重名的现象一定要坚决避免。gcc有一些隐式规则来决定处理同名变量的

方式,编译时可能没有任何警告和错误,但结果通常并非你所期望的。相关文章推荐阅读http://wangluobianc.blog.chinaunix.net

posted on 2012-05-21 15:12  程序风行网络  阅读(117)  评论(0)    收藏  举报