首页 > 解决方案 > 如果在 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变量上。

奇怪的是,在调试时,我在函数中printfiterator->name后面加上了一个,并且输出是正确的(所有元素名称都打印在 std 输出上)。whilefindName

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

标签: clinked-liststack

解决方案


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

解决方案是strcmp改用:

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

推荐阅读