我开始学习 C,但我不知道为什么应用程序总是崩溃。
#include <stdio.h>
#include <string.h>
typedef struct
{
char name[50];
int age;
}person;
void initPerson(person *aPerson, char name[50], int age)
{
strcpy(aPerson->name, name); // <- causes a crash
aPerson->age = age; // <- causes a crash
printf("%s", aPerson->name);
}
int main()
{
person *myPerson;
initPerson(myPerson, "Oscar", 45);
printf("%s, %i", myPerson->name, myPerson->age);
return 0;
}
我已经标记了导致崩溃的行。谁能告诉我问题出在哪里?
最佳答案
“...应用程序不断崩溃。...有人能告诉我问题出在哪里吗?”
是的,您的程序正试图写入不属于它的内存位置。
如果必须使用指向person
的指针,请在使用前创建一些内存:
int main()
{
person *myPerson = calloc(1, sizeof(*myPerson));
if(!myPerson) return 0; //test if failed
initPerson(myPerson, "Oscar", 45);
printf("%s, %i", myPerson->name, myPerson->age);
free(myPerson);//free memory
return 0;
}
或者,您可以简单地将 address of 传递给 person
的非指针实例(使用 &
)以获得相同的结果:
int main()
{
person myPerson = {0};
initPerson(&myPerson, "Oscar", 45);
printf("%s, %i", myPerson.name, myPerson.age);
return 0;
}
声明:
person *myPerson;
仅创建一个未初始化的指针,在创建时不指向内存中的任何特定位置。此时唯一使用的空间是指针本身,sizeof(person *)
。 (对于 32 位或 64 位目标分别为 4 或 8 字节。)在以这种方式使用指针变量之前,必须通过调用 _ void *calloc(size_t nitems, size_t size) 来动态分配空间。 _ 或家人。以这种方式创建的内存将指针的地址设置为与 nitems*size
字节的连续 block 的第一个字节重合的内存位置,这些字节被预留并专用于,在这种情况下,我的人
。以这种方式分配的内存称为堆内存,必须通过调用 free() 显式释放。 不再需要时。通常,只有在编译时不知道特定变量的内存要求时才推荐使用此方法
但是语句:
person myPerson;
静态(或自动,取决于创建的时间/地点。)立即分配sizeof(person)
字节的内存myPerson
的可用实例,位于内存中的地址:&myPerson
。以这种方式创建的内存称为堆栈内存。因为将 myPerson
( &myPerson
) 的地址作为参数传递给 initPerson()
,并完成与动态分配内存相同的事情(如上所述),这是一个更简单的选项,因为它不需要创建或释放任何内存。
Stack and heap memory explained.
Discussion on automatic, static and dynamic memory allocation
关于C 解引用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53852762/