C &引用;“下一个尺寸无效”;重新分配内存时发生异常
p.S.:我几乎有所有关于“下一个尺寸无效”的问题,但这些问题对我没有帮助,因为我没有另一段代码是malloc或realloc,因此排除了这一点。而且,我的分配没有超出内存空间的限制,所以在这方面我也很好 我有下面的代码,它在/server\u问题中给了我-C &引用;“下一个尺寸无效”;重新分配内存时发生异常,c,memory,memory-management,realloc,C,Memory,Memory Management,Realloc,p.S.:我几乎有所有关于“下一个尺寸无效”的问题,但这些问题对我没有帮助,因为我没有另一段代码是malloc或realloc,因此排除了这一点。而且,我的分配没有超出内存空间的限制,所以在这方面我也很好 我有下面的代码,它在/server\u问题中给了我-***错误:realloc():无效的下一个大小:0x08249170***` 我无法识别问题,我一次只分配64个字节,所以我没有内存地址空间不足,还有其他内存分配可能损坏了我的堆内存 错误显示,下一个大小无效,但正如我的上一个日志告诉我的那
***错误:realloc():无效的下一个大小:0x08249170***`
我无法识别问题,我一次只分配64个字节,所以我没有内存地址空间不足,还有其他内存分配可能损坏了我的堆内存
错误显示,下一个大小无效,但正如我的上一个日志告诉我的那样,重新分配64字节已中止(内核转储)
,所以这意味着我仍在尝试分配64字节。那么,为什么会出现错误呢
对于HTML文件,有任何超过256字节的文件
代码:(再现问题的最低代码)
更新:
即使我在
realloc
时分配64个字节而不是使用readBytes
,我也会得到同样的错误。由于这一行,我得到了错误-*content=realloc(*content,readBytes)代码>
而且,我的分配没有超出内存空间的限制,所以在这方面我也很好
过分确定代码是使调试更加困难的一种好方法。怀疑一切都错了
您没有分配足够的内存,因为您不正确地使用了realloc
。
p=realloc(p,n)
不会将n
字节添加到分配中,它会将总分配大小更改为您告诉它的大小
每次通过循环时,都要传递readBytes
,这是要复制的附加字节数。所以你的缓冲区永远不会增长。然后你继续写下它的结尾:
memcpy(*content + totalLength, ...
随着totalLength
在整个循环中不断增长
在这样的循环中调用realloc
,在性能方面通常是个坏主意。您应该预先分配足够的总空间,然后在循环中读取
要获取总文件大小,请执行以下操作:
size_t get_file_size(FILE *f)
{
long oldpos;
size_t result;
// Save the original file position
oldpos = ftell(f);
// Seek to the first byte past the end of the file
fseek(f, 0, SEEK_END);
// Get the file position - the number of bytes in the file
result = ftell(f);
// Return the file position to where it was
fseek(f, oldpos, SEEK_SET);
return result;
}
下面是一个测试,演示我所说的realloc
。注意,这使用了malloc\u可用大小,这通常是不好的做法
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main(void)
{
int i;
char *p = NULL;
for (i = 0; i < 10; i++) {
p = realloc(p, 16);
printf("[%d] size: %zd\n", i, malloc_usable_size(p));
}
return 0;
}
请注意,malloc\u usable\u size()
返回相同的值,即使在多次调用传递相同大小的realloc
之后也是如此。此外,即使我们分配了16个字节,它仍然返回24个字节,这也是分配器实现细节的结果
从malloc\u可用大小的手册页中:
注释
由于对齐和最小大小限制,malloc_可用_size()返回的值可能大于请求的分配大小。尽管应用程序可以覆盖多余的字节而不会产生不良影响,但这不是一种好的编程实践:分配中多余字节的数量取决于底层实现
此函数的主要用途是调试和自省
而且,我的分配没有超出内存空间的限制,所以在这方面我也很好
过分确定代码是使调试更加困难的一种好方法。怀疑一切都错了
您没有分配足够的内存,因为您不正确地使用了realloc
。
p=realloc(p,n)
不会将n
字节添加到分配中,它会将总分配大小更改为您告诉它的大小
每次通过循环时,都要传递readBytes
,这是要复制的附加字节数。所以你的缓冲区永远不会增长。然后你继续写下它的结尾:
memcpy(*content + totalLength, ...
随着totalLength
在整个循环中不断增长
在这样的循环中调用realloc
,在性能方面通常是个坏主意。您应该预先分配足够的总空间,然后在循环中读取
要获取总文件大小,请执行以下操作:
size_t get_file_size(FILE *f)
{
long oldpos;
size_t result;
// Save the original file position
oldpos = ftell(f);
// Seek to the first byte past the end of the file
fseek(f, 0, SEEK_END);
// Get the file position - the number of bytes in the file
result = ftell(f);
// Return the file position to where it was
fseek(f, oldpos, SEEK_SET);
return result;
}
下面是一个测试,演示我所说的realloc
。注意,这使用了malloc\u可用大小,这通常是不好的做法
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main(void)
{
int i;
char *p = NULL;
for (i = 0; i < 10; i++) {
p = realloc(p, 16);
printf("[%d] size: %zd\n", i, malloc_usable_size(p));
}
return 0;
}
请注意,malloc\u usable\u size()
返回相同的值,即使在多次调用传递相同大小的realloc
之后也是如此。此外,即使我们分配了16个字节,它仍然返回24个字节,这也是分配器实现细节的结果
从malloc\u可用大小的手册页中:
注释
由于对齐和最小大小限制,malloc_可用_size()返回的值可能大于请求的分配大小。尽管应用程序可以覆盖多余的字节而不会产生不良影响,但这不是一种好的编程实践:分配中多余字节的数量取决于底层实现
此函数的主要用途是调试和自省
即使我分配64个字节而不是使用readBytes
,我也会得到同样的错误。由于这一行,我得到了错误-*content=realloc(*content,readBytes)代码>“通过指定大小扩展/收缩现有指针的realloc”再次说明,您对realloc
的理解是不正确的。它将分配大小更改为给定的值。这并没有增加它。如果您调用了七次p=realloc(p,10)
,仍然只分配了10个字节。不是70岁。在代码中,这将涉及将totalLength+readSize
传递给realloc。你必须告诉它你想要的总字节数。仔细阅读。更改大小。。。到大小
字节。这是一个很好的捕获,有一个upv