/*
** 增加内存
*/
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#define N 5
jmp_buf buf;
void func()
{
int *p, *pa = NULL;
int i;
p = malloc(N * sizeof(int));
if(NULL == p)
longjmp(buf, 1);
for(i = 0; i < 2*N; i++)
{
if(i > N - 1)
{
if(NULL == pa)
{
pa = realloc(p, 2 * N * sizeof(int));
}
if(NULL == pa)
longjmp(buf, 2);
pa[i] = i;
}
else
{
p[i] = i;
}
}
for(i = 0; i < 2*N; i++)
{
printf("pa[%d] = %d/n", i, pa[i]);
}
}
int main()
{
int errn = setjmp(buf);
if(errn)
{
switch(errn)
{
case 1:
printf("malloc return null/n"); exit(1);
case 2:
printf("realloc return null/n"); exit(1);
}
}
func();
return 0;
}
/*
** 缩小内存
*/
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#define N 8
#define M 4
jmp_buf buf;
void func()
{
int *p, *pa = NULL;
int i, j;
p = malloc(N * sizeof(int));
if(NULL == p)
longjmp(buf, 1);
for(i = 0; i < M; i++)
{
p[i] = i;
}
if(i < N)
{
pa = realloc(p, i*sizeof(int));//千万不要忘记*sizeof(int)
if(NULL == pa)
longjmp(buf, 2);
}
for(j = 0; j < i; j++)
{
printf("pa[%d] = %d/n", j, p[j]);
}
}
int main()
{
int errn = setjmp(buf);
if(errn)
{
switch(errn)
{
case 1:
printf("malloc return null/n"); exit(1);
case 2:
printf("realloc return null/n"); exit(1);
}
}
func();
return 0;
}
本文介绍了一种使用setjmp和longjmp处理内存分配失败的方法,并通过两个示例演示了如何在C语言中实现内存的动态增加与缩小,对于理解内存管理及错误处理流程具有较高的参考价值。
280

被折叠的 条评论
为什么被折叠?



