几个小时以来,我一直在处理一个令人讨厌的内存损坏错误。我已经检查了这里的每个相关线程,但我无法修复它。
首先,我正在用C编写一个简单的终端。我正在解析管道(|)和重定向(>、<等)符号之间的命令,并将它们放在队列中。没什么复杂的!
以下是队列的数据结构;
struct command_node {
int index;
char *next_symbol;
struct command_node *nextCommand;
int count;
char **args;
};
当我在**args指针中存储小字符串时,一切都很好。然而,当其中一个参数很长时,我会得到malloc():内存损坏错误。例如,下面的第一个命令工作正常,第二个命令导致错误
1st: ls -laF some_folder | wc -l
2nd: ls -laF /home/enesanbar/Application | wc -l
我运行了调试器,它显示队列中新节点的malloc()调用导致了错误。
newPtr = malloc( sizeof(CommandNode) );
我正在仔细地分配字符串数组,并在处理完它们后释放,如下所示:
char **temp = NULL;
temp = malloc(sizeof(char*) * number_of_args);
/* loop through the argument array */
for (i = 0; i < number_of_args; i++) {
/* ignore the remaining commands after ampersand */
if (strcmp(args[i], "&") == 0) return;
/* split commands by the redirection or pipe symbol */
if (!isSymbol(args[i])) {
temp[count] = malloc(sizeof(strlen(args[i])) + 1);
strcpy(temp[count], args[i]);
count++;
/* if it is the last argument, assign NULL to the symbol in the data structure */
if (i + 1 == number_of_args) {
insertIntoCommands(&headCommand, &tailCommand, temp, NULL, count);
for (j = 0; j < count; j++) free(temp[j]);
count = 0; // reset the counter
}
}
else {
insertIntoCommands(&headCommand, &tailCommand, temp, args[i], count);
for (j = 0; j < count; j++) free(temp[j]);
count = 0; // reset the counter
}
}
我一定错过了什么,或者我不知道**args字段和新节点的分配,尽管这是我以前没有做过的。
但是,将一个数字包裹在sizeof周围怎么会导致节点分配错误呢?我只是出于好奇想弄明白。
就像我在评论中所说的,你试图在strlen函数中获得指针的大小,而不是通过函数提供的长度。
请查看以下内容:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void){
char *name = "Michi";
size_t length1, length2;
length1 = strlen(name);
length2 = sizeof strlen(name);
printf("Length1 = %zun",length1);
printf("Length2 = %zun",length2);
return 0;
}
输出:
Length1 = 5
Length2 = 8
还有一件事,在你free(temp[j])
之后,不要忘记free(temp)
。
类似这样的东西:
#include <stdio.h>
#include <stdlib.h>
int main(void){
long unsigned int size = 2,i;
char **array;
array = malloc(sizeof(char*) * size * size);
if (array == NULL){
printf("Error, Fix it!n");
exit(2);
}
for (i = 0; i < size; i++){
array[i] = malloc(sizeof(char*) * 100);
}
/* do code here */
for (i = 0; i < size; i++){
free(array[i]);
}
free(array);
return 0;
}