考虑以下两个程序:
/***************correct: no error for this code **************/
#include <stdio.h>
#include <string.h>
int main()
{
char *p ,*q ;
p =(char *)malloc(10) ;
strcpy( p , "AB") ;
*p = '\0' ;
p++ ;
q = p ;
//*q = 32 ;
free(q) ;
return 0;
}
/*************code2 which gives error ********************/
#include <stdio.h>
#include <string.h>
int main()
{
int *p ,*q ;
p =(int *)malloc(10) ;
*p = 30 ;
p++ ;
q = p ;
*q = 32 ;
free(q) ;
return 0;
}你能解释一下为什么第一个能用,而第二个不行吗?
发布于 2011-07-07 19:57:25
“正确”工作的代码有undefined behavior。这只是(坏)运气,它是有效的。实际上,看起来工作是UB导致的最糟糕的结果(不会引起你的警觉)。其他不起作用的代码也有未定义的行为。
只能对malloc、realloc或calloc返回的指针调用free
发布于 2011-07-08 01:42:57
C标准所说的是,你不能使用free(),因为普通的pointers.It说,当它与像malloc(),calloc()和realloc().Even这样的动态内存分配函数一起使用时,它会执行它的操作,但是如果你试图通过传递一个不涉及malloc(),calloc()和realloc()的普通指针来使用free(),它会导致未定义的行为,可能会导致核心转储错误或崩溃,代码会与你的编译器一起工作,因为编译器可能会以不同的方式开发(例如学生学习编译器),即使在TURBO上代码也能工作,但当你在cygwin或gcc编译器上工作时,它真的会失败。我建议你在cygwin和gcc编译器上工作,而不是其他编译器,因为他们会给你非常丰富的经验和知识,即使你可以学习多线程的概念。
发布于 2011-07-07 20:08:59
我相信这两个代码都是不正确的,应该以崩溃结束。当您执行malloc时,操作系统保留malloc返回的内存的初始地址,而free只能在malloc提供的地址上调用。
https://stackoverflow.com/questions/6610178
复制相似问题