realloc成功了为什么最后free还会出错,调试地址也没变,求大神解答

NabariOu 2016-08-26 10:12:05
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
#include<stdlib.h>
#define LENGTH 5
#define str_len 20
char str1[] = "quirt";
int main()
{
double *pS = (double*)calloc(LENGTH, sizeof(double));
double *psTemp = NULL;
char str[str_len] = "\0";
size_t temp = LENGTH;
double number[LENGTH] = { 0.0 };
bool flag = true;
size_t n = 0;
printf_s("Enter your numbers input \"quirt\" end:\n");
while (flag)
{
for (int i = 0; i < LENGTH; i++)
{
printf_s("%zd enter :", n + 1);
scanf_s("%s", str, str_len);
if (!strcmp(str, str1))
{
flag = false;
break;
}
if (n + 1 > temp)
{
for (int i = 0; i < n;i++)
printf_s("&pS=%p\n", pS+i);
if (!(psTemp = (double*)realloc(pS, LENGTH + n)))
{
printf_s("Error memory realloc.\n");
return 1;
}
pS = psTemp;
temp = temp + LENGTH;
for (int i = 0; i < LENGTH + n; i++)
printf_s("&pS=%p\n", pS + i);
printf_s("The memory crea extend to %zd\n", LENGTH+n);
for (int i = 0; i < LENGTH+n; i++)
printf_s("------%.3lf\n", *(pS + i));
}
*(pS + n) = atof(str);
n++;
}
}
long double count = 0.0;
printf_s("n=%zd\n", n);
for (int i = 0; i < n; i++)
{
count = count + *(pS + i);
printf_s("pS[%d]=%.3lf ", i, *(pS + i));
if ((i + 1) % 5 == 0)
printf_s("\n");
}
printf_s("\nThe total is %.3lf.\nThe avg is:%.3lf.\n", count, count / n);
psTemp = NULL;
printf_s("11111\n");
free(pS);
printf_s("11111\n");
pS = NULL;
printf_s("11111\n");
return 0;
}
...全文
1213 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-09
  • 打赏
  • 举报
回复
引用 11 楼 mstlq 的回复:
简单例子模拟类似楼主错误,连realloc都不需要,注意第一句的500和第二句的1000

char *p=malloc(500);
memset(p,7,1000);
free(p);
这种问题可以通过以下办法捕获:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
mstlq 2018-03-08
  • 打赏
  • 举报
回复
简单例子模拟类似楼主错误,连realloc都不需要,注意第一句的500和第二句的1000

char *p=malloc(500);
memset(p,7,1000);
free(p);
mstlq 2018-03-08
  • 打赏
  • 举报
回复
5楼所言甚是,还请楼主仔细检查
Datrilla 2018-03-02
  • 打赏
  • 举报
回复
我的程序 多加入三个字符没有申请多申请3个 使用用-lmcheck ,报错memory clobbered past end of allocated block
赵4老师 2016-08-29
  • 打赏
  • 举报
回复
if (!(psTemp = (double*)realloc(pS, (LENGTH + n)*sizeof(double)))) {
NabariOu 2016-08-29
  • 打赏
  • 举报
回复
引用 2楼小灸舞 的回复:
你这个肯定是越界破坏了堆空间。 导致内存管理信息被破坏,所以free出错
我调试了,但是发现指针地址都没有变化,而且数值也没有出错,应该没有越界
paschen 2016-08-29
  • 打赏
  • 举报
回复
引用 3 楼 NabariOu的回复:
引用 1楼paschen 的回复:
检查使用分配的内存有没出现越界情况,如果有会破坏了堆空间,通常表现在释放的时候出错
我调试了,但是发现指针地址都没有变化,而且数值也没有出错,应该没有越界
不是只有指针改变才会越界
小灸舞 版主 2016-08-29
  • 打赏
  • 举报
回复
PROTOTYPE:
void * realloc ( void * ptr, size_t new_size );

关于realloc的行为方式,结合源码总结为:
1. realloc失败的时候,返回NULL;

2. realloc失败的时候,原来的内存不改变,也就是不free或不move,(这个地方很容易出错);

3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址;

4. 如果size为0,效果等同于free();

5. 传递给realloc的指针可以为空,等同于malloc;

6. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的。
fefe82 2016-08-29
  • 打赏
  • 举报
回复
引用 4 楼 NabariOu 的回复:
[quote=引用 2楼小灸舞 的回复:]你这个肯定是越界破坏了堆空间。 导致内存管理信息被破坏,所以free出错
我调试了,但是发现指针地址都没有变化,而且数值也没有出错,应该没有越界[/quote] 你描述的现象(指针地址都没有变化,而且数值也没有出错)无法得到你的结论(没有越界)
NabariOu 2016-08-28
  • 打赏
  • 举报
回复
引用 1楼paschen 的回复:
检查使用分配的内存有没出现越界情况,如果有会破坏了堆空间,通常表现在释放的时候出错
我调试了,但是发现指针地址都没有变化,而且数值也没有出错,应该没有越界
小灸舞 版主 2016-08-27
  • 打赏
  • 举报
回复
你这个肯定是越界破坏了堆空间。 导致内存管理信息被破坏,所以free出错
paschen 2016-08-27
  • 打赏
  • 举报
回复
检查使用分配的内存有没出现越界情况,如果有会破坏了堆空间,通常表现在释放的时候出错

69,373

社区成员

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

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