c中java的new()有没有替代品[已关闭]

问题描述 投票:0回答:2

我正在尝试用 c 创建一个简单的扑克游戏,但很难使用循环将我的纸牌结构放入数组中,这样我就不必单独创建每个纸牌对象,然后手动将它们放入数组中一个。我对java比较熟悉,知道我可以使用“new className(类参数)”方法在数组中输入新对象,而无需一一命名和初始化它们。这本质上就是我在 java 中要做的事情,我想知道是否有办法使用 c 来做到这一点。

for(int i = 0; i < 14; i++){
    table_deck.deck[i] = new card("diamonds", i);
}

[链接中是我迄今为止使用 c 尝试过的] (https://i.stack.imgur.com/B8tkC.png)

我尝试做附加的照片,但无法通过编译。我希望有某种方法可以做到这一点,而无需手动单独初始化 52 张卡,然后将它们单独插入我的数组 52 中。

c data-structures initialization new-operator
2个回答
0
投票

C 不像 Java 那样有类。最接近的替代品是可以存储成员的

struct
。 Java
new
的作用是为类的新实例分配内存。 C 中最接近的等效项是使用
malloc()
并分配字段:

struct card {
    char suit[9];
    int value;
};
struct card *my_card = malloc(sizeof(struct card));
my_card->name = "diamonds";
my_card->number = 7;
free(my_card);

或者只是声明/使用堆栈变量:

struct card my_card = {"diamonds", 7};

如果您喜欢将参数传递给函数的想法:

struct card card_init(char *suit, int value) {
    struct card tmp;
    strcpy(tmp, suit);
    card.value = value;
    return tmp;
}

查看图像后,您正在寻找的语法称为复合文字:

for(int i = 0; i < 14; i++){
    table_deck.deck[i] = (struct card){"diamonds", i};
}

0
投票

这个 OP 链接的代码似乎想要将结构值分配给数组元素:

for (int i = 0; i < 14; i++) {
    table_deck.deck[i] = struct card {"diamonds", i};
}

上面的代码在 C 语言中不合法,但是您可以使用 compoundliteral 来完成此操作:

for (int i = 0; i < 14; i++) {
    table_deck.deck[i] = (struct card){"diamonds", i};
}

复合文字创建一个未命名的对象,如果它出现在任何函数之外,则该对象具有静态存储持续时间。否则,未命名对象具有自动存储持续时间,该持续时间在退出复合文字所在的块时结束。

一般来说,您必须小心通过复合文字创建的对象的生命周期。上述代码中的复合文字出现在

for
循环体中,并且它们的存储仅限于该块。赋值
table_deck.deck[i] = (struct card){"diamonds", i};
将未命名结构的内容复制到索引结构
table_deck.deck[i]

这里使用复合文字只是为了方便。完成同样事情的另一种方法是直接分配给相关字段。您可以修改

suit
结构体的
card
字段以接受指向
char
的指针,或者更好地接受指向
const char
的指针。然后可以将字符串文字(在静态内存中衰减为指向
char
的指针)分配给该指针:

struct card {
    const char *suit;
    int value;
};

/* ... */
int main(void) {
    /* ... */
    for (int i = 0; i < 14; i++) {
        table_deck.deck[i].suit = "diamonds";
        table_deck.deck[i].value = i;
    }
    /* ... */
}

或者您可以保留

card
结构体,并将字符复制到
suit
字段中:

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

struct card {
    char suit[9];
    int value;
};

/* ... */
int main(void) {
    /* ... */
    for (int i = 0; i < 14; i++) {
        strcpy(table_deck.deck[i].suit, "diamonds");
        table_deck.deck[i].value = i;
    }
    /* ... */
}

如果您选择尝试这样的解决方案,您必须确保尝试复制到

suit
字段中的任何字符串都适合(包括
\0
终止符)。您可能想使用
strncpy
来代替,但这会带来自己的问题,因为
strncpy
可以离开其目标数组而不会出现空终止。

© www.soinside.com 2019 - 2024. All rights reserved.