C-指针在函数之外获得垃圾值,但内部有规则的值



完整披露:这是我第一次在C中进行任何重要编程,也是我在堆栈溢出上的第一篇文章。

我正在研究最终将与野牛一起使用的代码,以实现计划/球拍语言的一小部分。所有这些代码都在一个C文件中。我有三个结构:BindingLambdaSymbolEntry。我还没有使用Lambda结构,它只是为了完整。我也有一个符号表,该表包含符号条目。 printSymbolTable()完全执行该名称所暗示的内容:

typedef struct
{
    char* name;
    char* value;
} Binding;
typedef struct
{
    int numBindings;
    Binding** bindings;
    char* functionBody; 
} Lambda;
typedef struct
{
    Binding* binding;
    Lambda* function;
} SymbolEntry;
SymbolEntry* symbolTable = NULL;
int numSymbols = 0;
void printSymbolTable()
{
    if (symbolTable)
    {
        int i = 0;
        for (i; i < numSymbols; i++)
        {
            printf("tsymbolTable[%i]: %s = %sn", i, symbolTable[i].binding->name, symbolTable[i].binding->value);
        }
    }
}

我目前正在尝试确定定义和查找变量的逻辑。相关功能:

// Takes a name and an exprssion and stores the result in the symbol table
void defineVar(char* name, char* expr)
{
    printf("nSetting %s = %sn", name, expr);
    printf("Previous number of symbols: %in", numSymbols);
    Binding props;
    props.name = name;
    props.value = expr;
    SymbolEntry entry;
    entry.binding = &props;
    entry.function = NULL;
    symbolTable = realloc(symbolTable, sizeof(SymbolEntry) * ++numSymbols);
    if (!symbolTable)
    {
        printf("Memory allocation failed. Exiting.n");
        exit(1);
    }
    symbolTable[numSymbols - 1] = entry;
    printf("New number of symbols: %in", numSymbols);
    printf("defineVar result:n");
    printSymbolTable();
}
// Test storing and looking up at least 4 variables, including one that is undefined
void testVars()
{
    printf("Variable testsn");
    defineVar("foo", "0");
    printf("After returning from defineVar:n");
    printSymbolTable();
    defineVar("bar", "20");
    printf("After returning from defineVar:n");
    printSymbolTable();
}

main()调用testVars()。编译时我没有任何警告或错误,并且该程序成功执行。但是,这就是结果:

Variable tests
Setting foo = 0
Previous number of symbols: 0
New number of symbols: 1
defineVar result:
    symbolTable[0]: foo = 0
After returning from defineVar:
    symbolTable[0]: 1�I��^H��H���PTI��@ = �E
Setting bar = 20
Previous number of symbols: 1
New number of symbols: 2
defineVar result:
    symbolTable[0]: bar = 20
    symbolTable[1]: bar = 20
After returning from defineVar:
    symbolTable[0]: 1�I��^H��H���PTI��@ = �E
    symbolTable[1]: 1�I��^H��H���PTI��@ = �E���

defineVar()函数之外,我不仅会获得垃圾值,而且定义bar的调用也显示不正确的非junk值。我不确定我在做什么错,但我认为这可能是realloc()的东西。但是,在将字符串解析为单个令牌时,类似的策略也有效,因此这就是我试图效仿的。我在做什么错?

,因为它指向变量(或变量 - 至少props,没有进一步读取)函数本地的本地读取,并且返回后堆栈帧被丢弃(并很快覆盖)。

最新更新