我有这个(奇怪的(问题:
我正在实现一种哈希表,我必须在其中插入一些预定义的元素,这就是问题所在:
如果我使用源文件中定义的函数推送这些新条目,find 函数不起作用,但如果我使用相同的函数但在主函数文件中定义,则一切正常。
下面是一些代码:
页眉
//SymbolTable.h
typedef struct element
{
const char* name;
int address;
struct element* prev;
} element_t;
typedef element_t* elemPoint;
//definition of functions
源
//SymbolTable.c
//include libraries and header file
static elemPoint last;
static elemPoint iterator;
void init()
{
last = NULL;
pushSymbol("SP",0);
pushSymbol("LCL",1);
pushSymbol("ARG",2);
pushSymbol("THIS",3);
pushSymbol("THAT",4);
}
void pushSymbol(const char* nameVar, int addressVar)
{
elemPoint pushed = malloc(sizeof(element_t));
pushed-> prev = last;
pushed-> name = nameVar;
pushed-> address = addressVar;
last = pushed;
}
int findName(const char* nameVar)
{
iterator = last;
while(iterator!=NULL)
{
if(iterator->name == nameVar)
{
return 1;
}
else
{
iterator = iterator->prev;
}
}
return 0;
}
主要
//main.c
//include libraries and header
int main()
{
init();
if(findName("LCL")) puts("true");
else puts("false");
}
这段代码的输出是false
的,但是如果我把整个init()
函数放在主模块中,输出是true
的。
所以我认为问题可能出在iterator
变量上。
奇怪的是,在调试时,我在findName
函数的while
后面放了一printf
iterator->name
,输出是正确的(所有元素名称都印在 std 输出上(。
所以现在我假设问题出在比较iterator->name == nameVar
,但我不明白为什么。
您正在将字符串与==
进行比较。在C中,由于字符串只不过是char *
,这并不意味着作为字符序列的相等,而是指针的相等,即存储位置。似乎您的编译器决定,如果同一个字符串在 main 函数中使用两次,则可以重用,但如果在不同的函数中使用,则不能重用。请注意,这只是编译器试图节省内存...
解决方案是改用strcmp
:
if (strcmp(iterator->name, nameVar) == 0)