首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Free表示错误

Free表示错误
EN

Stack Overflow用户
提问于 2011-07-07 19:54:54
回答 3查看 408关注 0票数 0

考虑以下两个程序:

代码语言:javascript
复制
/***************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;
}

你能解释一下为什么第一个能用,而第二个不行吗?

EN

回答 3

Stack Overflow用户

发布于 2011-07-07 19:57:25

“正确”工作的代码有undefined behavior。这只是(坏)运气,它是有效的。实际上,看起来工作是UB导致的最糟糕的结果(不会引起你的警觉)。其他不起作用的代码也有未定义的行为。

只能对mallocrealloccalloc返回的指针调用free

票数 13
EN

Stack Overflow用户

发布于 2011-07-08 01:42:57

C标准所说的是,你不能使用free(),因为普通的pointers.It说,当它与像malloc(),calloc()和realloc().Even这样的动态内存分配函数一起使用时,它会执行它的操作,但是如果你试图通过传递一个不涉及malloc(),calloc()和realloc()的普通指针来使用free(),它会导致未定义的行为,可能会导致核心转储错误或崩溃,代码会与你的编译器一起工作,因为编译器可能会以不同的方式开发(例如学生学习编译器),即使在TURBO上代码也能工作,但当你在cygwin或gcc编译器上工作时,它真的会失败。我建议你在cygwin和gcc编译器上工作,而不是其他编译器,因为他们会给你非常丰富的经验和知识,即使你可以学习多线程的概念。

票数 1
EN

Stack Overflow用户

发布于 2011-07-07 20:08:59

我相信这两个代码都是不正确的,应该以崩溃结束。当您执行malloc时,操作系统保留malloc返回的内存的初始地址,而free只能在malloc提供的地址上调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6610178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档