c - 指针在函数外部获取垃圾值,但在函数内部获取常规值

标签 c pointers realloc

全面披露:这是我第一次用 C 语言进行任何重要的编程,也是我在 Stack Overflow 上发表的第一篇文章。

我正在编写最终将与 Bison 一起使用的代码,以实现 Scheme/Racket 语言的一小部分。所有这些代码都在一个 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 = %s\n", i, symbolTable[i].binding->name, symbolTable[i].binding->value);
        }
    }
}

我目前正在尝试找出定义和查找变量的逻辑。 2个相关函数:

// Takes a name and an exprssion and stores the result in the symbol table
void defineVar(char* name, char* expr)
{
    printf("\nSetting %s = %s\n", name, expr);
    printf("Previous number of symbols: %i\n", 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: %i\n", numSymbols);
    printf("defineVar result:\n");
    printSymbolTable();
}

// Test storing and looking up at least 4 variables, including one that is undefined
void testVars()
{
    printf("Variable tests\n");

    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 的调用也显示了不正确的非垃圾值。我不确定我做错了什么,但我认为这可能是 realloc() 的问题。然而,在将字符串解析为单独的标记时,类似的策略是有效的,所以这就是我试图模仿的。我做错了什么?

最佳答案

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

关于c - 指针在函数外部获取垃圾值,但在函数内部获取常规值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13213992/

相关文章:

c - Linux 中的 atomic_t

c++ - 泄漏是什么意思?

c++为类分配内存

c++ - 将 3D 指针数组传递给函数

c - realloc 二维结构体数组

c - C语言中程序的范围是什么意思?

C程序在if语句中覆盖文件内容

c - 结构体静态数组字段的动态内存重新分配

c - 为什么退出循环后数组中的值会发生变化?

c - 警报历史堆栈或队列?