我在哪里访问非法内存? realloc(): 下一个大小无效

Where am I accessing illegal memory? realloc(): invalid next size

我正在为操作系统课程作业制作一个 shell 模拟器。 我们被要求添加一个“历史”命令,当输入时,应该打印用户输入的命令列表。

我决定使用历史数组来实现它,该数组根据新命令的大小动态分配更多内存。

这是我的代码:

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

#define BUFFER_SIZE 100

//comment

int main(void)
{
    close(2);
    dup(1);
    char command[BUFFER_SIZE];
    char* hist = NULL;
    // int counter = 0;

    while (1)
    {
        fprintf(stdout, "my-shell> ");
        memset(command, '[=10=]', BUFFER_SIZE);
        fgets(command, BUFFER_SIZE, stdin);
        if(strncmp(command, "exit", 4) == 0)
        {
            break;
        }
        
        //alocate memory for the current position in the hist array
        if(hist == NULL){
            hist = (char*)malloc(sizeof(char)*strlen(command));
        }
        else{
            hist = realloc(hist,sizeof(char)*strlen(command));
        }
        strcat(hist,command);
        printf("the size of the boy: %d\n",(int) strlen(hist));
        // counter += strlen(command);

        int pid = fork();

        char *argv[BUFFER_SIZE];
        char *pch;

        pch = strtok(command, " \n");

        int i;
        for(i=0; pch != NULL; i++){
            argv[i] = pch;
            pch = strtok(NULL, " \n");
        }
        argv[i] = NULL;

        int hasAmpersand = 0;
        //check if the last entered character was '&'
        if(*argv[i-1]=='&'){
            // printf("entered &:");
            hasAmpersand = 1;
            //replace it with '[=10=]'
            argv[i-1] = NULL;
        }
        
        if(pid == 0){ //child process execute sys call
            if(strncmp(argv[0],"history",7) == 0){
                printf("%s\n", hist);
                exit(1);
            }
            else{
                execvp(argv[0], argv);
                printf("\nbad syntax\n");
            }
        }
        else{
            if(!hasAmpersand){ //wait for child
                while(wait(NULL) != pid);
            }
        }
    }
    free(hist);

    return 0;
}

该实现适用于存储在 hist 中的最多 6 个命令,但因错误而崩溃

realloc(): invalid next size
aborted

我想知道是什么原因导致了这个问题,我很乐意提供解决问题的建议。谢谢

您需要为尾随字符串终止符 '[=11=]' 留出空间,因此将分配的大小加一:

hist = malloc(sizeof(char)*strlen(command) + 1);

realloc 的参数也需要调整。此外,您可能希望在调用 fgets.

后删除尾随的换行符

realloc 的第二个参数应该是整个块的新大小,而不仅仅是“添加”到内存区域的数据大小。

hist = realloc(hist, currentHistSize + sizeof(char)*strlen(command));

确保根据需要命名 currentHistSize。