c - C中实例创建和指向实例创建的指针之间的区别?
问题描述
给定以下 C 代码:
#include <stdio.h>
#include <string.h>
typedef struct a {
char name[10];
} a;
typedef struct b {
char name[10];
} b;
void copy(a *source, b *destination) {
strcpy(destination->name, source->name);
}
下面这个主要功能运行成功:
int main() {
a first;
b second;
strcpy(first.name, "hello");
copy(&first, &second);
printf("%s\n", second.name);
printf("Finished\n");
return 1;
}
虽然这个 main 函数会导致分段错误:
int main() {
a *first;
b *second;
strcpy(first->name, "hello");
copy(first, second);
printf("%s\n", second->name);
printf("Finished\n");
return 1;
}
根据我对 C 的理解,两种实现应该运行相同。实现之间有什么区别?如何调整第二个实现以成功运行完成?
解决方案
它们的运行方式不同,因为您没有在第二个示例中为first
and分配内存。second
为此,您可以使用以下方式分配它们malloc
:
a *first = malloc(sizeof(*first));
b *second = malloc(sizeof(*second));
如果您分配 using malloc
,请确保NULL
在使用它们之前检查指针是否存在。如果它们是NULL
,您应该返回一个错误或(在main
)退出程序。在一个重要的程序中,您还应该free
在使用完这些指针后调用它们。
或者,您可以在堆栈上分配它们:
a first[1];
b second[1];
这不需要你打电话free
。我推荐这种形式。
推荐阅读
- amazon-dynamodb - DynamoDB 表大小
- ios - 实例化视图控制器时出现 TypeMismatch 错误
- java - 制作一种在字符串中查找小写字母的方法
- mysql - 使用 MySql 5.7 中的动态列引用从另一个表更新表
- android - Android:如何使用 ViewModel 清除 Recyclerview 中的 Spannable 颜色?
- amazon-web-services - AWS ECS Fargate:应用程序负载均衡器返回 503 并带有奇怪的模式
- sql - 有没有办法在 PostgreSQL 函数中查询当前行值以及来自同一表的过滤结果集
- r - 如何对文件夹中的所有文件应用相同的转换
- swift - 如何在两个日期之间获取每个星期五的日期?
- python - 如何在 Plotly 3D 散点图中设置点标记的样式/格式?