每次调用函数时创建一个新变量
我试着用下面这段代码实现一个函数,使每次调用都会创建一个新的变量:
#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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。