将结构的第一个变量分配给另一个

assigning first variable of struct to another

我有 struct point,它有两个变量,但我不知道如何将字符串从一个变量分配给另一个变量。我还不熟悉指针,所以我不知道是否应该使用它们。

struct point
{
    int a, b;
    char name[5];
} A = {3, 5, "plane"}, B;

int main(){
    struct point B = {A.a, A.b, A.name};
    printf("%d %d %s", B.a, B.b, B.name);
}

输出为:3 5 ♀。如何将 A 的字符串分配给 B?

问题是一个包含 5 个字符的数组少了一个来容纳一个字符串 "plane"。您需要一个包含 6 个字符的数组(一个用于空终止符)。如果没有空终止符,当变量作为参数提供给 %s 转换说明符时,将发生越界访问(在搜索空终止符时),这将导致 undefined behaviour.

改变

char name[5];

char name[6];

如果您打算将 name 用作 字符串

也就是说,要将一个结构变量的值复制到另一个相同类型的变量中,你只需要使用赋值运算符=,如

 struct point B = A;

至于在 C 中声明一个字符串,您必须考虑到最后一个元素始终是 [=12=](它是 NULL ascii 字符)以便包含“平面”,您的数组应该很大“平面”的长度+1 (6, {'p','l','a','n','e','[=14=]'}).


如果要使用指针:

只需将B声明为结构点指针(*B),然后将其指向A即可打印A的值,只需将B指向他们。

#include <stdio.h>

struct point
{
    int a, b;
    char name[6];
} A = {3, 5, "plane"}, *B;

int main(){
    //struct point B = {A.a, A.b, A.name};
    B = &A;
    printf("%d %d %s", B->a, B->b, B->name);
}

没有指针:

您只需将 struct point B = {A.a, A.b, A.name}; 替换为 B = A;

#include <stdio.h>

struct point
{
    int a, b;
    char name[6];
} A = {3, 5, "plane"}, B;

int main(){
    //struct point B = {A.a, A.b, A.name};
    B = A;
    printf("%d %d %s", B.a, B.b, B.name);
}

我在 运行 这个程序

时收到这个警告

main.c:12:34: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
main.c:12:34: note: (near initialization for ‘B.name[0]’)

您不能将地址分配给数组,将 name 声明为指针或使用 strcpy,如下所示。

此外,您的数组 name 应该有一个 space 用于 [=14=],因此将其声明为 char name[6];

int main(){
    struct point B =  {A.a, A.b};//, A.name};
    
    strcpy(B.name,A.name);
    
    printf("%d %d %s", B.a, B.b, B.name);
}

你的代码的问题是在这个声明中

struct point B = {A.a, A.b, A.name};

最后一个初始化器 A.name 具有用于初始化字符数组的指针类型 char *。您不能用指针初始化数组。

你可以直接写

struct point B = A;

考虑到由于此初始化

struct point
{
    int a, b;
    char name[5];
} A = {3, 5, "plane"}, B;

字符数组 A.name 不包含字符串,因为数组中没有 space 作为字符串文字的终止零字符 '[=21=]'

因此,您不能在 printf

的调用中使用格式字符串 %s
printf("%d %d %s", B.a, B.b, B.name);

你可以这样写

printf("%d %d %.*s", B.a, B.b, ( int )sizeof( B.name ), B.name);

那就是你的程序可以看起来像

#include <stdio.h>

struct point
{
    int a, b;
    char name[5];
} A = {3, 5, "plane"}, B;

int main( void ){
    struct point B = A;
    printf("%d %d %.*s", B.a, B.b, ( int )sizeof( B.name ),B.name);
}

如果您希望字符数组 name 包含一个字符串,那么您需要至少将其大小再扩大一个字符,例如

struct point
{
    int a, b;
    char name[6];
} A = {3, 5, "plane"}, B;

在这种情况下,您可以使用以下调用 printf

printf("%d %d %s", B.a, B.b, B.name);