繁体   English   中英

字符指针的免费 2D 数组,free():无效指针错误

[英]Free 2D Array Of Char Pointers, free(): Invalid Pointers Error

我的程序运行没有错误,但是当我想释放 2D 字符数组(如参数 [0])时,它给了我: free():无效指针,鱼:作业 1,'./a.out' 由信号 SIGABRT 终止(中止)

/**
 * @brief Parses the input into arguments
 *
 * EXP:
 * "head -n 5 foo.txt"
 * arguments[0] = "head"
 * arguments[1] = "-n"
 * arguments[2] = "5"
 * arguments[3] = "foo.txt"
 * arguments[4] = NULL
 *
 * @param input
 * @return char**
 */
char** getArguments(char* input, int numOfArgs) {
    char copy_arguments[BUFSIZ]; /* To parse input */
    strcpy(copy_arguments, input);

    char** arguments = calloc(numOfArgs + 1, sizeof(char*));
    if (arguments == NULL) {
        return NULL;
    }

    /*allocate memory for arguments depending their length*/
    char* argument = NULL;
    for (int i = 0; i < numOfArgs; i++) {
        if (i == 0) {
            argument = strtok(copy_arguments, " ");
        } else {
            argument = strtok(NULL, " ");
        }

        int size_of_arg = strlen(argument);
        arguments[i] = calloc((size_of_arg + 1), sizeof(char));
        strcpy(arguments[i], argument);
    }
    arguments[numOfArgs + 1] = NULL;

    return arguments;
}

int main() {
    char **output = getArguments("hello world -n vim", 4);
    free(output[0]);
}

该函数调用未定义的行为。 分配numOfArgs + 1指针

char** arguments = calloc(numOfArgs + 1, sizeof(char*));

所以索引的有效范围是[0, numOfArgs]

因此在这个声明中

arguments[numOfArgs + 1] = NULL;

可以访问分配的数组之外的内存。

相反,你必须写

arguments[numOfArgs] = NULL;

通常,您应该检查返回的指针是否不等于NULL ,例如

if ( output ) free(output[0]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM