void test(void){
char *str=(char *)malloc(100);
strcpy(str,"hello");
free(str);
if(str!=NULL){
strcpy(str,"world");
printf(str);
}
}
A hello B world C 不可预测 D core dump
void test(void){
char *str=(char *)malloc(100);
strcpy(str,"hello");
free(str);
if(str!=NULL){
strcpy(str,"world");
printf(str);
}
}
A hello B world C 不可预测 D core dump
明显是D
应该是B
free(str)仅仅是清空了str指向的这100字节内存,并未把str置成NULL,所以if语句是成立的,而且这块内存此时在这个程序的进程空间中并未收回,strcpy是有效且正确的。不过说实话,我拿不准是不是应该是C,这种内存操作的结果确实是很不可预测的,说不定不同操作系统、不同编译环境结果还有差异
这个程序告诉我们,free或者c++里面的delete之后,保险起见最好手动进行一次NULL设置,这是一个良好的变成习惯,我通常也是这样写代码的,安全第一