动态内存分配 - realloc():下一个大小无效

时间:2014-04-05 18:20:35

标签: c pointers malloc realloc

我的要求是为我正在创建的char *变量进行动态内存分配,这样当我的applciation中的while循环读取数据时,内存分配应该会有所增加,但是当发生什么时会发生什么?我运行代码是我得到了错误,

*** glibc detected *** ./rpp: realloc(): invalid next size: 0x0000000001376010 ***

我通过此谷歌搜索(https://www.google.com/search?client=ubuntu&channel=fs&q=realloc%28%29%3A+invalid+next+size%3A+0x0000000002401010+&ie=utf-8&oe=utf-8#channel=fs&q=realloc%28%29:+invalid+next+size:+)在stackoverflow中发现了很多关于此主题的问题,但没有帮助。如果你的专家会帮助我修复这个错误,我真的会说服我,因为我现在对如何解决这个问题毫无头绪。跟着id给出了错误的函数。

int execScanNetowrk(){

    FILE *fp;
    int status;
    char path[1035];
    char *pathFull;
    pathFull = (char*)malloc(sizeof(path));


    /* Open the command for reading. */
    fp = popen("nmap -sP -oG - 192.168.1.0/24", "r");

    if (fp == NULL) {
            printf("Failed to run command\n" );
            exit;
    }

    /* Read the output a line at a time - output it. path stores each line of data per iteration*/
    while (fgets(path, sizeof(path)-1, fp) != NULL) {

        pathFull = (char*)realloc(pathFull, sizeof(path));//increase memory allocation
        strcat(pathFull,path);//concatenate char * with the read data           

    }

    printf("%s\n", a);  
    /* close */
    pclose(fp);
    free(a);
    return 0;

}

非常感谢:)

1 个答案:

答案 0 :(得分:3)

用于解决此类问题的常规技术是应用valgrind,这将为您提供指向问题的更详细的错误消息。

您的具体问题在于:

    pathFull = (char*)realloc(pathFull, sizeof(path));//increase memory allocation

realloc的第二个参数是您想要的总字节数增加分配的字节数。您需要跟踪pathFull的当前大小并执行realloc(pathFull, oldSize + sizeof(path))或类似内容。

在处理它之前,您真的想要将整个 nmap输出读入内存,还是在处理它们之前将整个读入内存的实际目标是什么?您的代码正在尝试执行前者,但您可能打算执行后者,在这种情况下getline可能比使用fgets更容易使用。

强制性挑剔:当用C 进行编码时,不强制转换mallocrealloc的返回值。这是不必要的,可能会阻止编译器在您忘记#include <stdlib.h>时注意到。