[英]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.