如果在不同的作用范围内重名,自然没有问题
返回指向临时变量的指针
大家都知道,栈里面的变量都是临时的。当前函数执行完成时,相关的临时变量和参数就都被清除了。不能把指向
这些临时变量的指针返回给调用者,因为这样的指针指向的数据是随机的,会给程序造成不可预料的后果。
下面是个错误的例子。
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
浙公网安备 33010602011771号