Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 自由产生错误_C_Unix_Malloc - Fatal编程技术网

C 自由产生错误

C 自由产生错误,c,unix,malloc,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) ; ret

考虑以下两个计划:

/***************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;
}
/************正确:此代码没有错误**************/
#包括
#包括
int main()
{
字符*p,*q;
p=(char*)malloc(10);
strcpy(p,“AB”);
*p='\0';
p++;
q=p;
//*q=32;
免费(q);
返回0;
}
/*************代码2给出了错误********************/
#包括
#包括
int main()
{
int*p,*q;
p=(int*)malloc(10);
*p=30;
p++;
q=p;
*q=32;
免费(q);
返回0;
}
你能解释一下为什么第一种方法有效,而第二种方法无效吗?

有效的代码是“正确的”。只是运气不好,它起作用了。实际上,看起来工作是UB最糟糕的结果(不会引起你的恐慌)。另一个不工作的代码也有未定义的行为


您可以调用
free
仅对
malloc
realloc
calloc
返回的指针进行调用,我相信这两个代码都不正确,应该会导致崩溃。与执行
malloc
时一样,操作系统保留
malloc
返回的内存初始地址,
free
只能在
malloc
给定的地址上调用。C标准规定,不能对普通指针使用free()。它说free()函数在与动态内存分配函数(如malloc()、calloc()和realloc()一起使用时执行其操作。即使您试图通过传递malloc()、calloc()和realloc()不涉及的普通指针来使用free(),它会导致未定义的行为,可能导致内核转储错误或崩溃,并且代码正在与编译器一起工作,因为编译器可能以不同的方式开发(例如,学生学习编译器)这段代码即使在TURBO c上也能运行,但当您使用cygwin或gcc编译器时,它确实会失败。我建议您使用cygwin和gcc编译器,而不是其他编译器,因为它们为您提供了非常丰富的经验和知识,即使您可以学习多线程的概念。

free()
ing未由
malloc()返回的任何内容在这两种情况下都是未定义的行为。如果一个人碰巧工作,那纯粹是运气,而不是你应该依赖的东西。不要使用
malloc
的返回值。强制转换充其量是多余的,并且(就像在代码中一样)可能隐藏错误;也就是说,未能包含声明了
malloc
的头,这使得编译器假定返回类型是
int
,而不是
void*
。虽然这不是一个很好的问题,但我认为它不值得投反对票。OP显然是在试图了解事情是如何运作的。当我开始学习C时,我也认为在
p+I
上调用free可以从
p+I
开始释放内存。我真的没看到奎斯蒂诺有什么犯罪行为。自由问题否决票是邪恶的不,未定义的行为不一定是崩溃。不要忘记接受一个答案。接受一个让你更有意义的答案。