关于realloc问题

luxurioucsc 2009-06-19 11:08:47
这程序的意思是现在一个顺序表内输出内容,然后要在这个顺序表内再插入一个是数字,这是要用realloc来增加一个空间
但是,输出的结果却不正确,除了顺序表的第一个位置,和插入位置的内容是正确的,其余的都是一个负数。这是什么问题造成的?

#include <stdio.h>
#include <malloc.h>

#include "list2.h"

main()

{
struct sqlist p1;

int *newbase,*newbase1 ,*q,*p;

int i;

int e=9;

newbase=(int *)malloc (sizeof (4));

if (!newbase) return 0;

p1.elem=newbase;

printf ("Input the number in the sqlist p1 --");

while (i<4)
{
scanf ("%d ",&p1.elem[i] );
i++;
}

printf ("\n");

for (i=0;i<4;i++)
printf ("p1->%d ",p1.elem[i]);

printf ("\n\n");

//realloc

newbase1=(int *)realloc(p1.elem,(4 +1)*sizeof(int));


if (!newbase1) return 0;

p1.elem=newbase1;

q=&p1.elem[2];

for(p=&p1.elem[4];p>=q;p--)
{

*(p+1)=*p;

}

*q=e;

for (i=0;i<5;i++)

printf ("p1->%d ",p1.elem[i]);

}
...全文
107 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyyapple 2009-06-19
  • 打赏
  • 举报
回复
  if (!newbase1) return 0;  // 1. 返回没有释放内存

p1.elem=newbase1;

q=&p1.elem[2];

for(p=&p1.elem[4];p>=q;p--)
{

*(p+1)=*p; // 2. 开始时赋值越界了

}
xyzooo 2009-06-19
  • 打赏
  • 举报
回复
for(p=&p1.elem[4];p>=q;p--)
{

*(p+1)=*p; ——改上面两处,这里还是会越界的,for(p=&p1.elem[3];p>=q;p--)
logiciel 2009-06-19
  • 打赏
  • 举报
回复
修改2处就好了:

1.
newbase=(int *)malloc (sizeof(int) * 4); //newbase=(int *)malloc (sizeof (4));

2.
i = 0; //新加
while (i <4)
luxurioucsc 2009-06-19
  • 打赏
  • 举报
回复
那要怎么改呀?
luc_cj 2009-06-19
  • 打赏
  • 举报
回复
估计是越界以后,产生的问题
【源码免费下载链接】:https://renmaiwang.cn/s/zxrkv 在C语言中,内存管理是程序员需要关注的重要部分,其中malloc、realloc和calloc是三个常用的动态内存分配函数。它们各自有不同的特点和用途,下面将详细介绍它们的区别和联系。1. **malloc**: - malloc函数用于分配指定字节数的存储空间。例如,`void* ptr = malloc(size_t size);`会分配`size`字节大小的内存,并返回一个指向这块内存的指针。分配的内存区域的初始值是不确定的,可能包含随机数据。分配失败时,malloc会返回NULL。2. **calloc**: - calloc函数与malloc类似,但它会为指定长度的对象分配能容纳其数量的存储空间,并且所有位都被初始化为0。例如,`void* ptr = calloc(num, size_t size);`会分配`num`个大小为`size`的对象,返回一个指向连续内存区域的指针。这在需要清零内存时非常有用,避免了手动初始化内存的步骤。3. **realloc**: - realloc函数允许改变之前通过malloc或calloc分配的内存区域的大小。它可以增加或减少内存空间,但最常见的是增加。例如,`void* new_ptr = realloc(void* ptr, size_t new_size);`尝试将`ptr`指向的内存区域调整为`new_size`字节。如果扩展成功且空间足够,realloc会在原地扩展内存;否则,它会在堆中寻找新的空间,将原有内容复制过去,并返回新指针。需要注意,如果内存区域被移动,原指针可能不再有效,因此应使用realloc返回的新指针。4. **realloc的特殊情况**: - 如果realloc的`ptr`参数为NULL,它会像malloc一样分

70,035

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧