求帮助 C语言realloc和free触发断点的问题

C语言 码拜 8年前 (2017-05-03) 2828次浏览
LZ目前自学C语言  在写小程序的时候遇到一些问题  请各位大神赐教一下 非常感谢
关联问题1:realloc触发断点问题
描述:LZ想要通过realloc实现动态数组 结果发现程序运行在realloc的时候 经常会停掉 为此调试后发现 运行到realloc处会自动触发断点 然后程序就无法继续运行下去了 代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)
int main(void)
{
	int bufLen = 10;
	int *nums = calloc(sizeof(int), bufLen);
	for (int i = 0; i < 10000; i++)
	{
		*(nums + i) = i;
		if (i == bufLen - 1)
		{
			realloc(nums, bufLen * 1.5);
			bufLen *= 1.5;
			printf("%d\n", bufLen);
		}
	}
	puts("--over--");
	return 0;
}

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)
void myRealloc(int **buf, int oldsize, int newsize)
{
	int *tmp = calloc(sizeof(int), newsize);
	for (int i = 0; i < oldsize; 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;
}

问题截图如下
求帮助 C语言realloc和free触发断点的问题
请各位大神解答一二 非常感谢!

解决方案

30

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#pragma warning(disable:4996)
 
int main(void)
{
    int bufLen = 10;
    int *nums = calloc(sizeof(int), bufLen);
    for (int i = 0; i < 10000; 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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 < 10000; 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)
void myRealloc(int **buf, int oldsize, int newsize)
{
    int *tmp = (int *)calloc(sizeof(int), newsize);
    for (int i = 0; i < oldsize; 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)
[1034331897@qq.com]
分享 (0)