每次调用函数时创建一个新变量

编程语言 2026-07-12

我试着用下面这段代码实现一个函数,使每次调用都会创建一个新的变量:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char* symbol;
    int address;
} SYMBOLS;

SYMBOLS** initSymbol(int totalCount, int assigned) {
    SYMBOLS** table = malloc(sizeof(SYMBOLS*) * assigned);
    return table;
}


SYMBOLS** addEntry(char* symbol, int line, SYMBOLS** table, int* totalCount) {
    int len = 0;
    while (*(symbol+len) != '\0') len++;
    len++;
    char* alias = malloc(sizeof(char) * len);
    strcpy(alias, symbol);
    SYMBOLS new = {alias, line};
    *(table+(*totalCount)) = &new;
    (*totalCount)++;
    printf("%d\n", *(totalCount));
    return table;
}

int main(void) {
    int* totalCount;
    *totalCount = 0;
    int assigned = 100;
    SYMBOLS** table = initSymbol(*totalCount, assigned);
    table = addEntry("asdf", 123, table, totalCount);
    table = addEntry("dsdsfff", 456, table, totalCount);
    printf("%s\n", (*(table+0))->symbol);
    printf("%s\n", (*(table+1))->symbol);
}

我在函数内创建了一个变量 alias,并尝试存储参数(symbol),但当函数再次被调用时,原先存储的值总是会损坏(在这种情况下,只有 dsdsfff 可读取)。

我以为这是因为分配给 alias 的内存在函数结束时会被释放,于是尝试使用 static 代替 malloc,但没有奏效。

有没有办法在函数结束后,防止这些值被释放?

解决方案

这个问题与 alias 变量无关。你其实已经正确地使用它了(不过,你把 while+malloc+strcpy 的用法整合成一次对 strdup() 的调用也能解决)。

真正的问题在于这里对 new 变量的使用:

*(table+(*totalCount)) = &new;

你正在动态分配一个包含100个指针的 table,然后再添加2 个实体,但这些条目是指向在函数退出时就会超出作用域的局部变量 new 的指针。当 main() 试图访问这些条目时,指针就失效了。你需要对单独的 SYMBOLS 对象进行 malloc(),而不仅仅是对 table 本身。

另外,在 main()totalCount 变量是一个未初始化的指针,指向任何地方都没有。这个变量本身不应该是一个指针,但你可以使用 & 运算符把一个指针传给你的函数。

最后,你正在造成内存泄漏。你应该始终 free() 任何你 malloc() 的东西。

请改用下面这个:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char* symbol;
    int address;
} SYMBOL;

SYMBOL** initSymbols(int capacity) {
    SYMBOL** table = malloc(sizeof(SYMBOL*) * capacity);
    return table;
}

void freeSymbols(SYMBOL** table, int count) {
    for(int i = 0; i < count; ++i) {
        free(table[i]->symbol);
        free(table[i]);
    }
    free(table);
}


SYMBOL** addEntry(const char* symbol, int line, SYMBOL** table, int* totalCount) {
    SYMBOL* newEntry = malloc(sizeof(SYMBOL));
    newEntry->symbol = strdup(symbol);
    newEntry->address = line;
    table[*totalCount] = newEntry;
    (*totalCount)++;
    printf("%d\n", *totalCount);
    return table;
}

int main(void) {
    int totalCount = 0;
    SYMBOL** table = initSymbols(100);
    addEntry("asdf", 123, table, &totalCount);
    addEntry("dsdsfff", 456, table, &totalCount);
    printf("%s\n", table[0]->symbol);
    printf("%s\n", table[1]->symbol);
    freeSymbols(table, totalCount);
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章