c语言代码re通常什么错误,求帮助 C语言realloc和free触发断点的问题

LZ目前自学C语言  在写小程序的时候遇到一些问题  请各位大神赐教一下 非常感谢

关联问题1:realloc触发断点问题

描述:LZ想要通过realloc实现动态数组 结果发现程序运行在realloc的时候 经常会停掉 为此调试后发现 运行到realloc处会自动触发断点 然后程序就无法继续运行下去了 代码如下

#include 

#include 

#include 

#pragma warning(disable:4996)

int main(void)

{

int bufLen = 10;

int *nums = calloc(sizeof(int), bufLen);

for (int i = 0; i 

{

*(nums + i) = i;

if (i == bufLen - 1)

{

realloc(nums, bufLen * 1.5);

bufLen *= 1.5;

printf("%d\n", bufLen);

}

}

puts("--over--");

return 0;

}

问题截图如下

c0a9ce4a94133b0a44b391d0877923ab.png

关联问题2:free释放触发断点问题

描述:LZ想要写个和realloc看起来差不多的功能出来 创建了一个函数 用于开辟一个新的堆空间 将原始堆空间的数据拷贝到新空间中 然后释放原始空间 结果发现 释放原始空间的时候 free会触发断点 代码如下

#include 

#include 

#include 

#pragma warning(disable:4996)

void myRealloc(int **buf, int oldsize, int newsize)

{

int *tmp = calloc(sizeof(int), newsize);

for (int i = 0; i 

{

*(tmp + i) = *(*buf + i);

}

free(*buf);

*buf = tmp;

}

int main(void)

{

FILE *fr = fopen("d:\test.txt", "rb");

int bufSize = 10;

int bufIndex = 0;

int *buf = calloc(sizeof(int), bufSize);

int *count = calloc(sizeof(int), bufSize);

while (!feof(fr))

{

int tmp = 0;

fscanf(fr, "%d", &tmp);

int index = getBufIndex(buf, bufSize, tmp);

if (index == -1)

{

*(buf + bufIndex) = tmp;

*(count + bufIndex) += 1;

bufIndex++;

if (bufIndex == bufSize)

{

bufSize *= 1.5;

myRealloc(&buf, bufSize, bufSize);

printf("%d\n", bufSize);

}

}

else

{

*(buf + index) = tmp;

*(count + index) += 1;

}

}

free(buf);

free(count);

puts("over");

return 0;

}

问题截图如下

2c9b35c6e0af6ee5ebcb211b12cb0751.png

请各位大神解答一二 非常感谢!

解决方案

30

#include 

#include 

#include 

#pragma warning(disable:4996)

int main(void)

{

int bufLen = 10;

int *nums = calloc(sizeof(int), bufLen);

for (int i = 0; i 

{

*(nums + i) = i;

if (i == bufLen - 1)

{

realloc(nums, bufLen * 1.5);

bufLen *= 1.5;

printf("%d\n", bufLen);

}

}

puts("--over--");

return 0;

}

该程序已经越界,注意,第一次realloc是将nums的空间缩小了,原来是10 × 4 = 40, 现在的长度是10 × 1.5 = 15;

但是realloc申请的新空间没有给nums,所以nums的有效空间还是40(10个int),即使这样,还是越界,原因是i的值在增加;

假如你的想法是递增的增加内存,详见下面的demo:

#include 

#include 

#include 

#pragma warning(disable:4996)

int main(void)

{

int i;

int bufLen = 10;

//int *nums = calloc(sizeof(int), bufLen);

int *nums = (int *)calloc(bufLen , sizeof(int));

for (i = 0; i 

*(nums + i) = i;

printf("i = %d\n", i);

if (i == bufLen - 1) {

nums = (int *) realloc(nums, bufLen * sizeof(int) * 1.5);

if (!nums) {

fprintf(stdout, "realloc error!\n");

exit(-1);

}

bufLen *= 1.5;

printf("bufLen = %d\n", bufLen);

}

}

puts("--over--");

return 0;

}

30

myRealloc(&buf, bufSize, bufSize);

myRealloc函数中后面的两个实参是一样的,大小一样,就没有old或new,这样会导致myRealloc中的buf越界。

#include 

#include 

#include 

#pragma warning(disable:4996)

void myRealloc(int **buf, int oldsize, int newsize)

{

int *tmp = (int *)calloc(sizeof(int), newsize);

for (int i = 0; i 

{

*(tmp + i) = *(*buf + i);

}

free(*buf);

*buf = tmp;

}

int main(void)

{

FILE *fr = fopen("d:\test.txt", "rb");

int bufSize = 10;

int bufIndex = 0;

int *buf = (int *)calloc(sizeof(int), bufSize);

int *count = (int *)calloc(sizeof(int), bufSize);

while (!feof(fr))

{

int tmp = 0;

fscanf(fr, "%d", &tmp);

int index = getBufIndex(buf, bufSize, tmp);

if (index == -1)

{

*(buf + bufIndex) = tmp;

*(count + bufIndex) += 1;

bufIndex++;

if (bufIndex == bufSize)

{

//bufSize *= 1.5;   /*del */

myRealloc(&buf, bufSize, bufSize * 1.5);    /*old and new*/

printf("%d\n", bufSize);

}

}

else

{

*(buf + index) = tmp;

*(count + index) += 1;

}

}

free(buf);

free(count);

puts("over");

return 0;

}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求帮助 C语言realloc和free触发断点的问题!

  • 0
    点赞
  • 0
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值