C语言使用free后无法运行的原因以及解决方法
先看代码:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#pragma warning (disable:4996)
int main()
{
char *temp;
temp = (char *)malloc(sizeof(char));
printf("temp:");
scanf("%s", temp);
printf("%s", temp);
puts(temp);
free(temp);
printf("success\n");
getchar();
getchar();
return 0;
}
PS:#pragma warning (disable:4996)仅用在2017版VS中无视安全检查,getchar()用于暂停运行。
运行结果:
输入“123”能够正常输出“123”,但是free()函数不能正常执行。出现HEAP CORRUPTION DETECTED的错误。
原因:temp只向系统要求开辟一个空间,而实际上输入字符串超过了开辟的空间存贮量。
解决方法:使用malloc申请足够的空间。
例如:
temp = (char *)malloc(sizeof(char)*10);
下面是我对这个问题的个人看法:
free用于回收用户在程序运行时动态申请的空间,实际上C程序在执行完全部内容后一些非动态申请空间的变量也会进行空间的回收。
实际上数组也会因为类似于此的问题而导致程序运行失败。
int main()
{
char temp[4];
printf("temp:");
scanf("%s", temp);
printf("%s\n", temp);
puts(temp);
printf("success\n");
getchar();
getchar();
}
程序运行时输入的字符串长度超过了数组申请的长度,尽管仍能够正常输出字符串。但在程序进入结束阶段时程序报错。