realloc后的分段错误

realloc后的分段错误,c,malloc,popen,realloc,pclose,C,Malloc,Popen,Realloc,Pclose,这是我的代码: void Available_firmware_version(){ char *version = (char *) malloc(2); strcpy(version, ""); FILE *fp; int status = 0; char path[PATH_MAX]; fp = popen("swift list Manto", "r"); if (fp == NULL){ printf("Error: Popen is NULL \n"); retu

这是我的代码:

void  Available_firmware_version(){
char *version = (char *) malloc(2);
strcpy(version, "");
FILE *fp;
int status = 0;
char path[PATH_MAX];
fp = popen("swift list Manto", "r");

if (fp == NULL){
    printf("Error: Popen is NULL \n");
    return;
}

while (fgets(path, PATH_MAX, fp) != NULL){
    version = (char *) realloc(version, strlen(version) + strlen(path));
    strcat(version, path);
    printf("%s\n", version);
}

status = pclose(fp);
if (status == -1) {
    printf("Error: Popen not closed (pclose)\n");
    return;
}
free(version);
}

当我执行代码时,我的程序崩溃了。输出为分段故障,在pclose(fp)命令之前。当我删除realloc程序运行良好。也许我对realloc做了什么错事

strlen(version)+strlen(path)+1
您缺少NUL终止符缓冲区太短您的内存分配中缺少一个字节用于“\0”字符。
version=realloc(version,strlen(version)+strlen(path)+1)
不要强制转换realloc的返回值,该返回值表示:您非常不幸(或幸运,取决于情况),因为只有1个字节太短而导致程序崩溃。这些类型的错误通常是看不见的,或者在你的程序中就像一颗定时炸弹。永远不要做
version=realloc(version…
如果realloc返回NULL怎么办?这将导致泄漏。
strlen(版本)+strlen(路径)+1
您缺少NUL终止符缓冲区太短您的“\0”字符的内存分配中缺少一个字节。
version=realloc(版本,strlen(版本)+strlen(路径)+1)
不要强制转换realloc的返回值,该返回值表示:您非常不幸(或幸运,取决于情况),因为只有1个字节太短而导致程序崩溃。这些类型的错误通常是看不见的,或者在你的程序中就像一颗定时炸弹。永远不要做
version=realloc(version…
如果realloc返回NULL怎么办?这会导致泄漏。