常见内存错误
一 0xC0000005
1 报错信息:
未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
2 报错截图:
3 错误代码:
#include"stdio.h"
void main()
{
char * p = NULL;
printf("内存异常处理:\n");
printf("错误提示: 未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。\n");
printf("错误原因: 使用了未初始化的指针\n");
printf("解决办法: p = (char *)malloc(sizeof(char)*5);");
memcpy(p, "abcd", strlen(p)); //未分配堆空间
printf("%s\n",p);
getchar();
}
4 解决办法
5 正确的代码:
#include"stdio.h"
void main()
{
char * p = NULL;
printf("内存异常处理:\n");
printf("错误提示: 未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。\n");
printf("错误原因: 使用了未初始化的指针\n");
printf("解决办法: p = (char *)malloc(sizeof(char)*5);\n");
p = (char *)malloc(sizeof(char)* 5);//添加这行代码即正确
memcpy(p, "abcd", strlen(p)); //未分配堆空间
printf("输出字符串:%s\n",p);
getchar();
}
二 0xC00000FD(递归调用导致栈溢出):
1 报错信息:
0xC00000FD: Stack overflow
2 报错截图
3 错误代码
#include"stdio.h"
sum(int num)
{
if (num == 1)
return 1;
return sum(num - 1) + num;
}
void main()
{
int num = 0;
num = sum(10000);
printf("%d",num);
getchar();
}
4 解决办法
把递归计算1到1000的和改成用循环(非递归)来计算
#include"stdio.h"
int sum(int num)
{
int i = 0;
int sum = 0;
for (i = num; i >= 1; i--)
{
sum = sum + i;
}
return sum;
}
void main()
{
int num = 0;
num = sum(10000);
printf("%d",num);
getchar();
}
二 0xC00000FD(数组导致栈溢出):
1 报错信息:
0xC00000FD: Stack overflow
2 报错截图
3 错误代码
#include"stdio.h"
void main()
{
char ch[1020*1024];
getchar();
}
4错误原因
栈空间只有1M ,大于1M的空间就会出现溢出的现象
5 解决办法
a 申请堆空间
#include"stdio.h"
void main()
{
char *ch = (char *)malloc(sizeof(char)* 1020 * 1024);
getchar();
}
b 定义成全局变量
#include"stdio.h"
char ch[1020 * 1024];
void main()
{
getchar();
}