考虑以下两个程序:
/***************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;
}
你能解释为什么第一个有效,但第二个没有?
答案 0 :(得分:13)
“正确”的代码有undefined behavior。它的运气只是(坏)运气。实际上看起来工作是由于UB可能发生的最坏情况(不会引起警报)。其他不起作用的代码也有未定义的行为。
您可以在free
,malloc
或realloc
答案 1 :(得分:1)
C标准所说的是你不能将free()用于普通指针。它说free()函数在与动态内存分配函数(如malloc(),calloc()和realloc一起使用时执行其动作()。即使你试图通过传递一个不涉及malloc(),calloc()和realloc()的普通指针来尝试使用free(),它会导致未定义的行为,它可能导致核心转储错误或崩溃,代码正在与您的编译器一起使用,因为编译器可能以不同的方式开发(例如学生学习编译器),即使使用TURBO c,代码也能正常工作,但是当您使用cygwin或gcc编译器时,它确实失败。我建议你使用cygwin和gcc编译器而不是其他编译器,因为它们可以为您提供非常丰富的经验和知识,即使您可以学习多线程的概念。
答案 2 :(得分:0)
我相信这些代码都不正确,最终会导致崩溃。当您执行malloc
时,操作系统会保留malloc
和free
返回的内存的初始地址,只能在malloc
给出的地址上调用。