Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C &引用;“下一个尺寸无效”;重新分配内存时发生异常_C_Memory_Memory Management_Realloc - Fatal编程技术网

C &引用;“下一个尺寸无效”;重新分配内存时发生异常

C &引用;“下一个尺寸无效”;重新分配内存时发生异常,c,memory,memory-management,realloc,C,Memory,Memory Management,Realloc,p.S.:我几乎有所有关于“下一个尺寸无效”的问题,但这些问题对我没有帮助,因为我没有另一段代码是malloc或realloc,因此排除了这一点。而且,我的分配没有超出内存空间的限制,所以在这方面我也很好 我有下面的代码,它在/server\u问题中给了我-***错误:realloc():无效的下一个大小:0x08249170***` 我无法识别问题,我一次只分配64个字节,所以我没有内存地址空间不足,还有其他内存分配可能损坏了我的堆内存 错误显示,下一个大小无效,但正如我的上一个日志告诉我的那

p.S.:我几乎有所有关于“下一个尺寸无效”的问题,但这些问题对我没有帮助,因为我没有另一段代码是malloc或realloc,因此排除了这一点。而且,我的分配没有超出内存空间的限制,所以在这方面我也很好

我有下面的代码,它在/server\u问题中给了我-
***错误: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