c - C 取消引用指针
问题描述
我开始学习 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;
}
或者,您可以简单地传递(using )的非指针实例的地址以获得相同的结果: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) _ 或族来动态分配空间。以这种方式创建的内存将指针的地址设置为与一个连续字节块的第一个字节一致的内存位置,该字节块留出并专用于,在这种情况下,. 以这种方式分配的内存称为堆内存,必须通过调用free()显式释放nitems*size
myPerson
当不再需要它时。通常,仅在编译时不知道特定变量的内存要求时才建议使用此方法
但声明:
person myPerson;
静态(或自动,取决于创建时间/位置。)sizeof(person)
为立即可用的实例分配内存myPerson
,位于内存中的地址:&myPerson
. 以这种方式创建的内存称为堆栈内存。因为将myPerson
( &myPerson
) 的地址作为参数传递给initPerson()
,并完成与使用动态分配的内存(上面讨论过)完成的相同的事情,所以这是一个更简单的选项,因为它不需要任何内存创建或释放。
推荐阅读
- concatenation - 有没有办法在 [onshow; 中连接多行?如果 [var.x]!='0'; 然后'这里多行';else '']
- gcc - 如何更改 OpenMPI 的编译器
- python-3.x - 如何检查进程之间腌制的数据
- windows - 如何以编程方式获取 Windows 显示器/监视器/屏幕标识号?
- python-3.x - Python - 如何创建连接命令
- java - 使 Mapbox 标记可点击并返回标记的 ID
- azure-devops - Azure DevOps - 应用服务 - 并行插槽交换
- c++ - 设置以改进 Visual Studio 难以理解的编译/构建错误:MSB6006:“CL.exe”退出代码 2
- kubernetes - 如何使用 rabbitmqctl 从 RabbitMQ Kubernetes 集群外部访问?
- android - 通过 Android 管理 API 自托管/EMM 托管的私有应用程序