c - 如果在 main 中添加了元素,则在 C 中查找链表的元素有效,但如果没有,则无效?
问题描述
我有这个(奇怪的)问题:
我正在实现一种哈希表,我必须在其中插入一些预定义的元素,这就是问题所在:
如果我使用源文件中定义的函数推送这些新条目,则查找函数不起作用,但如果我使用相同的函数推送它们但在主函数文件中定义,则一切正常。
这是一些代码:
标题
//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
变量上。
奇怪的是,在调试时,我在函数中printf
的iterator->name
后面加上了一个,并且输出是正确的(所有元素名称都打印在 std 输出上)。while
findName
所以现在我假设问题出在比较iterator->name == nameVar
中,但我不明白为什么。
解决方案
您正在将字符串与==
. 在 C 中,由于字符串只不过是char *
,这并不意味着作为字符序列的相等性,而是指针的相等性,即存储位置。似乎您的编译器决定如果在主函数中使用相同的字符串两次,则可以重用它,但如果在不同的函数中使用则不能。请注意,这只是试图节省内存的编译器......
解决方案是strcmp
改用:
if (strcmp(iterator->name, nameVar) == 0)
推荐阅读
- java - 如何将@Transactional 与@KafkaListener 一起使用?
- mysql - Order by multiple columns not working as expected
- angular - 角度测试:模拟包含 blob 的 HttpResponse
- c# - xamarin,如何将内容顺利上传到 StackLayout
- java - Android Gradle jar 生成
- python - Python For 循环查询
- c++ - 使用 doxygen 在 GitLab 项目上自动生成 C++ 文档
- ios - 声明方法不可用,因为 swift 5 中的特定 iOS 版本
- getstream-io - 如何在 Swift 中获取 Activity Reaction 的 Activity Id
- matlab - 矩阵:高斯缩减