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;
}
问题截图如下
关联问题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;
}
问题截图如下
请各位大神解答一二 非常感谢!
解决方案
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触发断点的问题!