c语言编程realloc的问题,在线急等,高分相送

来源:百度知道 编辑:UC知道 时间:2024/06/19 18:01:22
#include <malloc.h>
#include <stdio.h>

void main(){
int *a=NULL;
for (int i=0;i<10;i++){
a=(int *)realloc(a,4);
a[i]=i; //第一遍输出
printf("%d\n",a[i]);
}
for (int i=0;i<10;i++){ //第二遍输出
printf("%d\n",a[i]);
}
free(a);
} 结果第一遍输出0~9正常,第二遍时a[1]变为-33686019,且运行到free时出现“遇到问题需要关闭”字样,请大虾帮忙
希望大家能够认真解答
首先realloc参数里的4是指新增4个字节,即一个int长度,二楼、四楼知识有误
另外这段程序的目的就是想通过for循环将一个数组的长度每次加1,五楼关于放在外边的建议我无法接受
希望五楼能够详细解释下realloc十次当然会有问题是什么意思

和八楼的差不多,但原来有点误区,还是改正一下
#include <malloc.h>
#include <stdio.h>

void main()
{
int *a=NULL;
int i ;
for (i = 0; i < 10; i++)
{
//函数原型:void * recalloc(void * _Memory, size_t _Size);
//size_t _Size 指的是函数返回的指针所指的内存单元的长度,
//函数将_Memory对象的储存空间改变为给定的大小_Size,而不是加 _Size
//所以内存单元的长度应该是随着i在变化的(如果硬要放在循环里面),
//如果是4的,内存的长度就永远是4 ,后面的越界访问了
a = (int *)realloc(a, (i + 1) * sizeof(int));
a[i] = i; //第一遍输出
printf("%d\n", a[i]);
}
for ( i = 0; i < 10; i++)
{ //第二遍输出
printf("%d\n", a[i]);
}
free(a);
}

虽然你的程序中第一次输出的都是正确的,但是由于每次你都是使用的
realloc(a,4); 事实上a所指单元的内存单元长度并没有变,一直都是4
后6个值都是存放在该程序的管辖的内存范围之外的。
所以第二次输出的时候,就会出现一个不可预料的数据,后面的正确数据只是因为在第二次输出的时候没有别的程序访问或者利用这段内存空间,因此会有正确的输出。

#include <malloc.h> 

#include <stdio.h> 

void main() 

{