使用以下程序怎么不会出现任何错误?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
char *pStr = (char*) malloc(25);
free(pStr);
strcpy(pStr, "foo");
printf("%s\n", pStr);
return 0;
}
不应该free(pStr)
阻止我写那个地址吗?我不必在使用之前再次分配空间吗?
free
只要语法正确,它就不会阻止您执行任何操作。因此,char*
如果您从未从未分配过内存,那么仍然非常欢迎将其复制到一个副本。但这是未定义的行为,很容易(可能会)导致您的程序崩溃或在没有警告的情况下做错了什么。
例如,如果您的编译器进行了一些优化,为了节省时间,它可能会对某些指令重新排序。由于您已经释放了内存,因此编译器可能会认为在该位置为稍后将要创建的其他数据分配内存是安全的。如果优化器将该分配移动并写入您的位置strcpy
,则可以覆盖存储在此处的对象。
考虑以下代码:
int main(int arc, char *argv[]){
char* pStr = (char*) malloc(25);
free(pStr);
strcpy(pStr, "foo");
printf("%s\n", pStr);
int* a = (int*) malloc(sizeof(int));
*a = 36;
printf("%d\n", *a);
}
既然你写信给未分配的内存,你可以不知道什么任何的的printf
旨意显示。36个字符可能已经覆盖了某些“ foo”字符串。“ foo”字符串可能已覆盖a
指向的值36 。也许它们都不会对彼此产生影响,并且您的程序似乎运行得很好,直到您更改某个变量的名称并重新编译,并且由于某种原因,即使您没有进行任何更改,所有内容都被弄乱了。
故事的寓意:您正确的是,您不应该写入free
d内存;但是,您不能写入free
d内存是不正确的。C不会检查这种情况,并假定您正在尝试做一些花哨的事情。如果您确切地知道编译器如何优化以及在malloc
调用时它将在哪里分配内存,那么您可能会知道在特定情况下写入未分配的内存是安全的,并且C不会阻止您这样做。但时间是你不知道的99.999%的一切,只是没有做到这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句