“......应用程序不断崩溃......有人能告诉我出了什么问题吗?”
是的,您的程序正在尝试写入它不拥有的内存位置。
如果必须使用指针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;
}
或者,您可以简单地传递地址的非指针实例person
(using &
)得到相同的结果:
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 大小) https://www.tutorialspoint.com/c_standard_library/c_function_calloc.htm_ 或家人。以这种方式创建的内存将指针的地址设置为与连续块的第一个字节一致的内存位置。nitems*size
预留并专用的字节,在这种情况下,myPerson
。以这种方式分配的内存称为堆内存并且必须通过调用显式释放free() https://www.tutorialspoint.com/c_standard_library/c_function_free.htm当不再需要它时。通常,仅当编译时未知特定变量的内存需求时才建议使用此方法
但声明:
person myPerson;
静态地 (Or 自动地,取决于创建的时间/位置。)分配内存sizeof(person)
立即可用实例的字节数myPerson
,位于内存中的地址:&myPerson
。以这种方式创建的内存被称为堆栈存储器。因为传递的地址是myPerson
( &myPerson
)作为参数initPerson()
,并完成与动态分配内存(上面讨论的)相同的事情,这是一个更简单的选项,因为它不需要任何内存创建或释放。
堆栈和堆内存解释。 https://www.gribblelab.org/CBootCamp/7_Memory_Stack_vs_Heap.html
自动、静态和动态内存分配的讨论 https://stackoverflow.com/questions/8385322/difference-between-static-memory-allocation-and-dynamic-memory-allocation