C 断言失败到一定程度

C 断言失败到一定程度,c,malloc,assertion,C,Malloc,Assertion,我一直收到malloc.c断言失败的消息。我看过其他类似的问题,但似乎找不到解决办法。这是我的代码…在出错之前,我在现场放置了一个printf int ParseCommand(char *cmd_line, struct command_t *cmd, char **paths) { int argc; char **line_ptr; char *tmp_name = (char *) malloc(sizeof(MAX_PATH_LEN)); /* Ini

我一直收到malloc.c断言失败的消息。我看过其他类似的问题,但似乎找不到解决办法。这是我的代码…在出错之前,我在现场放置了一个printf

int ParseCommand(char *cmd_line, struct command_t *cmd, char **paths)
{
    int argc;
    char **line_ptr;
    char *tmp_name = (char *) malloc(sizeof(MAX_PATH_LEN));

    /* Initialization */
    line_ptr = &cmd_line;
    argc = 0;
    cmd->argv[argc] = (char *) malloc(MAX_ARG_LEN);

    /* Fill argv[] Array */
    while((cmd->argv[argc] = strsep(line_ptr, WHITESPACE)) != NULL) {
        cmd->argv[++argc] = (char *) malloc(MAX_ARG_LEN);
    }

    /* Set The Command Name & argc */
    cmd->argc = argc - 1;
    tmp_name = LookupPath(cmd->argv, paths);

    if(tmp_name == NULL) {
        Fatal("Command Not Found!");
    }
    printf("HERE 4\n");
    cmd->name = (char *) malloc(sizeof(tmp_name));
    strncpy(cmd->name, tmp_name, MAX_PATH_LEN);
    free(tmp_name);
}
错误是:

smallsh: malloc.c:2369: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted (core dumped)

非常感谢您的帮助

这通常意味着堆数据已损坏,即
libc
内存管理器使用的数据结构已损坏。很难看出是什么引起的(特别是只给出了整个程序的一个函数)。考虑使用类似的工具或类似的工具来找出程序损坏堆的点。

<代码>代码> MLALC(siMPOF(TMPONNEX))< /C> >将分配足够的空间来存储一个指针。然后将最多
MAX\u PATH\u LEN
字节复制到该分配中,这显然是错误的

您应该使用正确的大小计算替换(…)的大小,可能是
1+strlen(…)


此外,
strncpy
如果
tmp\u name
的第一个
MAX\u PATH\u LEN
字节中没有空终止符,则不会以空终止目标缓冲区。这可能是一个bug。

您在这一行中为一个
char
指针分配了空间:
cmd->name=(char*)malloc(sizeof(tmp_name))但我不知道这是否是导致错误的原因。请与valgrind一起运行,以获得有关错误的确切详细信息。