如果在 main 中添加了元素,则可以在 C 中查找链表的元素,但如果不是,则不会?



我有这个(奇怪的(问题:

我正在实现一种哈希表,我必须在其中插入一些预定义的元素,这就是问题所在:

如果我使用源文件中定义的函数推送这些新条目,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后面放了一printfiterator->name,输出是正确的(所有元素名称都印在 std 输出上(。

所以现在我假设问题出在比较iterator->name == nameVar,但我不明白为什么。

您正在将字符串与==进行比较。在C中,由于字符串只不过是char *,这并不意味着作为字符序列的相等,而是指针的相等,即存储位置。似乎您的编译器决定,如果同一个字符串在 main 函数中使用两次,则可以重用,但如果在不同的函数中使用,则不能重用。请注意,这只是编译器试图节省内存...

解决方案是改用strcmp

if (strcmp(iterator->name, nameVar) == 0)

相关内容

  • 没有找到相关文章

最新更新