- 注册
- 2003-07-10
- 消息
- 9,868
- 荣誉分数
- 440
- 声望点数
- 193
最初由 老兵新手 发布
原题只是:
void func(char *p)
{
printf(p);
}
问有什么问题?
我看不出来. 就假定了这个调用:
char *s = (char *)1;
func(s);
当然, 也可以用任何数代替 1;
如果 p 是在程序地址空间内, 我看不出问题.
问题很多啊。
p 在printf()的格式化字符串的位置。
1) 如果p是一个一般字符串,那就显示那个字符串
char *s = "normal string";
func(p);
这个跟 printf("normal string");意义一样
2) 如果p是一个带特殊化字符的字符串
char *s = "un-normal %x";
func(p);
这个跟 printf("un-normal %x"); 意义一样,虽然你没有数字变量,printf()取堆栈上的相应位置数字来表示。
3) 如果p含有特殊字符,比如:
char *s = "un-normal %s";
func(p);
这会导致printf()使用堆栈相应位置内容为指针,去读那个指针所指的内容。通常引起读写内存错
4) 如果p更本不是字符串,printf()有可能为了找到格式化字符串尾(NULL)而引起读写内存错。
5)如果p是一个非法指针,printf()在读写格式化字串时就会有读写内存错。