【发布时间】:2012-02-26 06:01:37
【问题描述】:
我认为这个问题完全是内存分配不足的问题。
(可能跳到底部,阅读最后一个问题以获得一些简单的建议)
我正在编写这个程序来读取用户输入的文件。如果文件“包含”其他文件,那么它们也将被读取。为了检查另一个文件是否包含一个文件,我解析了字符串的第一个单词。为此,我编写了一个返回已解析单词的函数,并传入一个指针,该指针被设置为下一个单词的第一个字母。例如考虑字符串:
"include foo" 注意文件只能包含 1 个其他文件
firstWord == 包括,chPtr == f
我的算法解析 firstWord 以使用“include”测试字符串是否相等,然后解析第二个单词以测试文件有效性并查看文件是否已被读取。
现在,我的问题是正在读取许多文件并且 chPtr 被覆盖。因此,当我将指针返回到下一个单词时。下一个单词有时会包含前一个文件的最后几个字符。考虑名为 testfile-1 和 bogus 的示例文件:
让 chPtr 原来等于 testfile-1,现在考虑解析 'include bogus':
提取 firstWord 将 == 包含,并且 chPtr 将被覆盖以指向 b in bogus。因此,chPtr 将等于 b o g u s '\0' l e - 1。 l e - 1 是 testfile-1 的最后几个字符,因为每次调用我的函数时 chPtr 都指向相同的内存地址。这对我来说是个问题,因为当我解析 bogus 时,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)然后返回复制的副本?如果不出意外,你永远不会free(temp)所以你会泄漏内存,而实际上return temp;会一样好(并为你节省新分配的开销)。 -
“这对我来说是个问题,因为当我解析伪造的,chPtr 将指向 l”你是什么意思当找到 '\0' 时你会停止解析吗?
标签: c string parsing malloc deep-copy