首页 > 解决方案 > 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 的理解,两种实现应该运行相同。实现之间有什么区别?如何调整第二个实现以成功运行完成?

标签: c

解决方案


它们的运行方式不同,因为您没有在第二个示例中为firstand分配内存。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。我推荐这种形式。


推荐阅读