我有一个让我很困惑的问题......下面我正在调用一个初始化函数:
void Initialize (List *L) {
char* initialize = "initialize";
int i;
for (i=0; i<MAXLISTSIZE; i++) {
strncpy(L->items[i].name,initialize,MAXNAMESIZE);
L->items[i].name[MAXNAMESIZE - 1] = '\0';
L->items[i].grade = 0;
printf("L->items[i].name = %s\n", L->items[i].name);
printf("L->items[i].grade = %d\n", L->items[i].grade);
}
L->count = 0;
}
Run Code Online (Sandbox Code Playgroud)
它似乎工作,我在循环中打印值,这很好.如果我也在main中打印一个相同的循环以进行双重检查它也可以正常工作但是如果我只是在initialize函数之后打印main中的值(在Initialize中没有打印语句)我得到完全垃圾.
似乎我存储我的价值的记忆并不是保持一致,我无法弄清楚为什么.
我需要malloc内存用于结构吗?由于我不需要可变数量的存储,我认为没有必要...我不确定如何去做.
我的结构:
typedef Student Item;
#define MAXLISTSIZE 4
typedef struct {
Item items[MAXLISTSIZE];
int count;
} List;
#define MAXNAMESIZE 20
typedef struct {
char name[MAXNAMESIZE];
int grade;
} Student;
Run Code Online (Sandbox Code Playgroud)
我只是从main调用Initialize:
int main () {
List *newList;
/*call initialize function*/
newList = callInitialize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
callInitialize:
List *callInitialize () {
List *L;
List studentList;
L = &studentList;
Initialize(L);
return L;
}
Run Code Online (Sandbox Code Playgroud)
现在您发布了导致实际问题的函数,我们看到了什么错误:您正在返回超出范围的局部变量的地址!这是无效的.
List * foo()
{
List x; // <--- x comes to life
return &x; // <--- x dies here...
}
int main()
{
List * p = foo(); // ... but its address is used here!
p->name ... // dereferencing an invalid address!!
}
Run Code Online (Sandbox Code Playgroud)
您的情况需要动态(或"手动")分配,这意味着内存分配的生命周期仅由您控制,而不是由本地范围控制.
List * initList()
{
return malloc(sizeof(List)); // this memory is permanent
}
Run Code Online (Sandbox Code Playgroud)
任何手动分配都需要一个清理程序:
void freeList(List * p)
{
free(p);
}
Run Code Online (Sandbox Code Playgroud)