我写了以下程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main(int argc, char *argv[]){
char *input;
input = (char*)malloc(16);
printf("input is : %s\n", input);
}
当我运行它时:
./test `python -c 'print "A"*5000'`
它不会崩溃。它而是打印数据。
当我使用free(input)
after printf
,它崩溃了。
为什么会发生这种情况?
显示的代码忽略其命令行参数:
int main(int argc, char *argv[]){
char *input;
input = (char*)malloc(16);
printf("input is : %s\n", input);
}
Python 脚本提供什么并不重要。然而,你的printf()
正在打印未初始化的数据;这会导致未定义的行为。如果printf()
不会崩溃,并且有一个free(input);
之后调用printf()
,那么free()
不应该崩溃。
如果您错过了复制操作并打算显示类似的内容,则规则会有所不同:
int main(int argc, char *argv[]){
char *input;
input = (char*)malloc(16);
strcpy(input, argv[1]);
printf("input is : %s\n", input);
free(input);
return 0;
}
现在你没有检查argv[1]
在使用它之前不是空指针——这可能会导致崩溃。如果你传递 5000 个字符,你就会超出分配的内存范围argv[1]
。有些事情可能会引发崩溃;没有定义什么会导致崩溃。这strcpy()
可能会失败;这printf()
如果副本没有失败,则可能不会失败(但这不能保证);这free()
可能会失败,因为你超出了界限(但即使如此也不能保证)。这就是“未定义行为”的奇迹;任何事情都可能发生,这是有效的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)