Эта проблема, по-моему, является исключительно проблемой нехватки памяти.C программируемые строки, указатели и их назначение
(возможно перейти к нижнему и прочитать последний вопрос для некоторых простых предложений)
Я пишу эту программу, которая считывает файл (ы), введенный пользователем. Если файл «включает» другие файлы, они также будут прочитаны. Чтобы проверить, содержит ли другой файл файл, я разбираю первое слово строки. Для этого я написал функцию, которая возвращает синтаксическое слово, и передается указатель, который устанавливается в первую букву следующего слова. Для примера рассмотрим строку:
«включают Foo» Примечание файлы могут содержать только 1 файл
firstWord == включают, chPtr == е
Мой алгоритм разбирает firstWord для проверки строки равенства с 'include', он затем анализирует второе слово, чтобы проверить достоверность файла и посмотреть, был ли файл уже прочитан.
Теперь моя проблема в том, что многие файлы читаются, а chPtr перезаписывается. Поэтому, когда я возвращаю указатель на следующее слово. В следующем слове будут содержаться последние несколько символов предыдущего файла. Рассмотрим пример файлы с именем TestFile-1 и поддельным:
Пусть chPtr первоначально равна TestFile-1 и рассмотрим теперь парсинг «включают поддельным»:
извлекая firstWord будет включать в себя == и chPtr будут переписаны на укажите на b в фиктивном. Таким образом, chPtr будет равен b o g u s '\ 0' l e - 1. l e - 1 - это последние несколько символов тестового файла-1, так как chPtr указывает на тот же адрес памяти каждый раз, когда вызывается моя функция. Это проблема для меня, потому что, когда я разбираю фикцию, chPtr укажет на l. Вот код для моей функции:
char* extract_word(char** chPtr, char* line, char parseChar)
//POST: word is returned as the first n characters read until parseChar occurs in line
// FCTVAL == a ptr to the next word in line
{
int i = 0;
while(line[i] != parseChar && line[i] != '\0')
{
i++;
}
char* temp = Malloc(i + 1); //I have a malloc wrapper to check validity
for(int j = 0; j < i; j++)
{
temp[j] = line[j];
}
temp[i+1] = '\0';
*chPtr = (line + i + 1);
char* word = Strdup(temp); //I have a wrapper for strdup too
return word;
Итак, это моя проблема диагностики правильной? Если да, сделаю ли я глубокие копии chPtr? Также, как сделать глубокие копии chPtr?
Большое спасибо!
Почему вы 'Strdup (темп)', а затем вернуть дублированную копию? Если ничего больше, вы никогда не будете «свободными (temp)», поэтому вы будете пропускать память, и на самом деле «return temp;» будет так же хорош (и сэкономить накладные расходы на новое распределение). –
Что вы подразумеваете под «Это проблема для меня, потому что, когда я разбираю фикцию, chPtr укажет на l» Не остановите анализ, когда будет найден «\ 0»? –