realloc 给出错误 - 下一个大小无效
realloc is giving error - invalid next size
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int temp;
int main()
{
FILE * fp;
fp = fopen("input2.txt", "r"); //Open the input
int counter = 0;
int realloc_counter = 10;
int *line_array; //Initialize the array
line_array = malloc(10 * sizeof(int)); //Allocate memory for initial ten numbers, of size int for each
while (fscanf(fp, "%d", &temp) > 0)
{
line_array[counter] = temp;
counter ++;
if (counter % 10 == 0)
{
realloc_counter = realloc_counter * 2;
line_array = realloc(line_array, realloc_counter);
}
}
fclose(fp); //Close the input file
free(line_array); //Free the memory
上面的代码是我的。它一直给我一个错误,我似乎无法弄清楚。使用 valgrind 它说有一个大小为 4 的无效写入。有什么建议或见解吗?
使用动态内存分配时出现 "invalid next size" 风格的错误消息通常是因为您通过超出已分配缓冲区末尾的写入破坏了内存区域。
看看你的两条分配线:
line_array = malloc(10 * sizeof(int));
line_array = realloc(line_array, realloc_counter);
首先是将元素计数乘以元素大小,以便分配的 字节 数是正确的。第二种是单独使用元素 count,而不将其乘以元素大小。
所以你第一次重新分配时,realloc_counter
设置为 20,所以你几乎肯定会 shrink 分配的内存(虽然这取决于当然是关于你的整数和字节的相对大小。
例如,如果sizeof(int) == 4
,您首先分配正确的四十个字节,然后在您需要的是八十个时重新分配二十个。
你应该做的是:
line_array = realloc(line_array, realloc_counter * sizeof(int));
顺便说一句,您应该也检查malloc
和realloc
的return值,看它们是否失败。假设它们总是有效并不是一个好主意。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int temp;
int main()
{
FILE * fp;
fp = fopen("input2.txt", "r"); //Open the input
int counter = 0;
int realloc_counter = 10;
int *line_array; //Initialize the array
line_array = malloc(10 * sizeof(int)); //Allocate memory for initial ten numbers, of size int for each
while (fscanf(fp, "%d", &temp) > 0)
{
line_array[counter] = temp;
counter ++;
if (counter % 10 == 0)
{
realloc_counter = realloc_counter * 2;
line_array = realloc(line_array, realloc_counter);
}
}
fclose(fp); //Close the input file
free(line_array); //Free the memory
上面的代码是我的。它一直给我一个错误,我似乎无法弄清楚。使用 valgrind 它说有一个大小为 4 的无效写入。有什么建议或见解吗?
使用动态内存分配时出现 "invalid next size" 风格的错误消息通常是因为您通过超出已分配缓冲区末尾的写入破坏了内存区域。
看看你的两条分配线:
line_array = malloc(10 * sizeof(int));
line_array = realloc(line_array, realloc_counter);
首先是将元素计数乘以元素大小,以便分配的 字节 数是正确的。第二种是单独使用元素 count,而不将其乘以元素大小。
所以你第一次重新分配时,realloc_counter
设置为 20,所以你几乎肯定会 shrink 分配的内存(虽然这取决于当然是关于你的整数和字节的相对大小。
例如,如果sizeof(int) == 4
,您首先分配正确的四十个字节,然后在您需要的是八十个时重新分配二十个。
你应该做的是:
line_array = realloc(line_array, realloc_counter * sizeof(int));
顺便说一句,您应该也检查malloc
和realloc
的return值,看它们是否失败。假设它们总是有效并不是一个好主意。