【问题标题】:Using a function to initialize a struct yields compiler error [duplicate]使用函数初始化结构会产生编译器错误[重复]
【发布时间】:2020-08-11 12:13:00
【问题描述】:

我正在尝试使用函数初始化结构。

#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>

#define NAME_SIZE 20
#define MANA_COST_SIZE 6
#define TYPE_SIZE 20
#define TEXT_SIZE 500
#define FLAVOR_SIZE 500
#define COLOR_SIZE 6

typedef struct card
{  
    char mana_cost[MANA_COST_SIZE];
    char name[NAME_SIZE];
    char type[TYPE_SIZE];
    char text[TEXT_SIZE];
    char flavor[FLAVOR_SIZE];
} card_t;

void init_card(card_t* card, char name[], char mana_cost[], char type[], char text[], char flavor[])
{  
    strcpy_s(card->name, NAME_SIZE, name);
    strcpy_s(card->mana_cost, MANA_COST_SIZE, mana_cost);
    strcpy_s(card->type, TYPE_SIZE, type);
    strcpy_s(card->text, TEXT_SIZE, text);
    strcpy_s(card->flavor, FLAVOR_SIZE, flavor);
}

main()
{  
    card_t* card;
    init_card(card, "Brainstorm", "u", "Instant", "Draw 3 cards, then put two cards from your hand on top of your library", "flavor");
    printf("%s\n", card->name);
}

编译器给出错误:使用了未初始化的局部变量“card”。我所读到的一切都表明这应该是可能的。我尝试将其更改为指向结构的指针而不是结构本身,但结果相同。我错过了什么?

【问题讨论】:

  • 注意:通常情况下,char* 的缓冲区大小适合内容,而不是这些巨大的超大缓冲区,其中几乎没有任何内容。
  • strcpy_s() 是什么?
  • 这能回答你的问题吗? Update (int) variable in C inside a function 在副本中使用int 作为类型-原理相同,您只是使用了card_t
  • @ArkadiuszDrabczyk 它是(Windows)对 C 标准的补充,可在(有争议的,我说受到高度批评的)可选附件 K 中提供。cppreference 使用 _CRT_SECURE_NO_WARNINGS 宏来禁用 Windows 上的警告。
  • @KamilCuk 会的,但我已经尝试过使用指针,编译器给出了相同的结果。我编辑了发布的代码以反映这一点。

标签: c function struct structure


【解决方案1】:

这是因为您正在传递对象的副本。因此,在您的函数 init_card 中,card 是一个本地对象,它不会更改 main 函数中的那个。

您要做的是使用指向card 的指针:

void init_card(card_t *card, char name[], char mana_cost[], char type[], char text[], char flavor[])
{  
    strcpy(card->name, name);
    strcpy(card->mana_cost, mana_cost);
    strcpy(card->type, type);
    strcpy(card->text, text);
    strcpy(card->flavor, flavor);
}

int main()
{  
    card_t card;
    init_card(&card, "Brainstorm", "u", "Instant", "Draw 3 cards, then put two cards from your hand on top of your library", "flavor");
    printf("%s\n", card.name);
}

请注意,我将您的函数 strcpy_s 替换为 strcpy

符号&amp;用于检索变量的地址。

这里card的类型是card_t所以&amp;cardcard_t的地址,所以它是card_t *

【讨论】:

  • 嗯。我以为我已经尝试过使用指针。我做了card_t* card 而不是&amp;card,它给出了同样的错误,但我只是按照你的方式尝试了它并且它有效!所以谢谢你的解决方案,但我想我现在更困惑了......
  • @NicholasBabcock 我已经编辑了答案以解释&amp; 用于检索变量的地址。所以&amp;card会给你一个card_t *
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
相关资源
最近更新 更多