免费提供错误

时间:2011-07-07 11:54:54

标签: c unix malloc

考虑以下两个程序:

/***************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;
}

你能解释为什么第一个有效,但第二个没有?

3 个答案:

答案 0 :(得分:13)

“正确”的代码有undefined behavior。它的运气只是(坏)运气。实际上看起来工作是由于UB可能发生的最坏情况(不会引起警报)。其他不起作用的代码也有未定义的行为。

您可以在freemallocrealloc calloc >

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我相信这些代码都不正确,最终会导致崩溃。当您执行malloc时,操作系统会保留mallocfree返回的内存的初始地址,只能在malloc给出的地址上调用。