В настоящее время я пытаюсь разобрать строку в массив строк.
До сих пор я считаю, что мне удалось разделить строку, вставив '\0'
после каждого слова "чанк".
Однако, когда я позже пытаюсь освободить строковый массив, некоторые из моих слов имеют один и тот же байтовый адрес, и, таким образом, когда я пытаюсь освободить одно из них, другое также освобождается.
Это код моего парсера, я прошу прощения за его грязную форму:
/*
* parser()
*
* Parses a given string into different words and returns a list with the words.
* If there is a non-space and non-alphabetic character an error is recorded.
*/
void parser(char* str, char** actualList, char** freeingList,char* error, int* length){
// initialize variables
bool chara = false;
bool beginning = true;
int size = strlen(str);
bool nonAlphaSpace = false;
// iterate through the entire string
for(int i = 0; i < size; i++){
// if the character is not either a space or an alphabetic character
if(isspace(str[i])==0 && isalpha(str[i])==0 && !nonAlphaSpace){
*error = str[i];
nonAlphaSpace = true;
}
}
// if there was no irregular character
if(!nonAlphaSpace){
for(int j = 0; j < size; j++){
// if the character is the beginning of the current string
if(beginning){
// record this string into the list of words
freeingList[*length] = &str[j];
(*length)++;
// set the status of any alphabetic character being present to false;
chara = false;
// if the current character is an alphabetic character
if(isalpha(str[j])!=0){
chara = true;
}
beginning = false;
}
// if the character is a space
else if(isspace(str[j])!=0){
// if there was a character beforehand
if(chara){
// get the pointer to the next character
char* new = &str[j+1];
// change the current character to a null
str[j] = '\0';
// realign the pointer to the string to rest of the string
str = new;
j = -1;
size = strlen(str);
beginning = true;
}
}
// if the character is an alphabetic character
else{
chara = true;
}
}
// if the last chunk of string left didn't contain any characters
if(!chara){
free(str);
}
// for every word extracted
for(int k = 0; k < *length; k++){
int newSize = strlen(freeingList[k]);
bool first = true;
// get the pointer to the first character in the word, i.e. not the first few spaces
for(int l = 0; l < newSize; l++){
if(isspace(freeingList[k][l])==0 && first){
actualList[k] = &freeingList[k][l];
first = false;
}
}
}
}
}
Это когда я пытаюсь освободить его:
// free the current collection of strings
for(int j = 0; j < size; j+=2){
free(words[j]);
}
Когда явведите "home or for"
в анализатор и позже попытайтесь освободить его, адрес "home"
равен 0x7fffffffe840
, а адрес "for"
равен 0x7fffffffe848
.Это заставляет меня поверить, что освобождение home
также освобождает or
, что позже вызывает ошибку SIGABRT.
Верно ли это предположение?Как я могу преодолеть это двойное освобождение?