我的要求是为我正在创建的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;
}
非常感谢:)
答案 0 :(得分:3)
用于解决此类问题的常规技术是应用valgrind
,这将为您提供指向问题的更详细的错误消息。
您的具体问题在于:
pathFull = (char*)realloc(pathFull, sizeof(path));//increase memory allocation
realloc
的第二个参数是您想要的总字节数,不增加分配的字节数。您需要跟踪pathFull
的当前大小并执行realloc(pathFull, oldSize + sizeof(path))
或类似内容。
在处理它之前,您真的想要将整个 nmap输出读入内存,还是在处理它们之前将整个行读入内存的实际目标是什么?您的代码正在尝试执行前者,但您可能打算执行后者,在这种情况下getline
可能比使用fgets
更容易使用。
强制性挑剔:当用C 进行编码时,不强制转换malloc
或realloc
的返回值。这是不必要的,可能会阻止编译器在您忘记#include <stdlib.h>
时注意到。