c# c语言中是否有Java的new()的替代品

hc2pp10m  于 2023-08-01  发布在  C#
关注(0)|答案(2)|浏览(255)

我试图在c中创建一个简单的扑克游戏,并且很难使用循环将我的卡片结构放入数组中,这样我就不必单独创建每个卡片对象,然后将它们逐个手动放入数组中。我对java比较熟悉,知道我可以使用“new className(class parameters)”方法在数组中输入新对象,而不需要逐个命名和初始化它们。这是我在java中要做的基本工作,我想知道是否有一种方法可以使用c来做到这一点。

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

字符串
[In这个链接是我迄今为止使用c](https://i.stack.imgur.com/B8tkC.png)所尝试的
我试着做所附的照片,但不会通过编译。我希望有一些方法让我这样做,而不是手动初始化52卡单独和他们插入他们内我的阵列52单独。

2cmtqfgy

2cmtqfgy1#

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;
}

vojdkbi0

vojdkbi02#

这段代码似乎想给数组元素赋值一个结构体值:

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

字符串
上面的代码在C中是不法律的的,但是你可以使用 compound literal 来完成这一点:

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


一个复合文本创建一个未命名的对象,如果它出现在任何函数之外,该对象具有静态存储期限。否则,未命名对象具有自动存储持续时间,该持续时间在出现复合文字的块退出时结束。
必须小心使用复合文字创建的对象的生存期。由于上面的代码在main中使用了复合文字,因此您可以使用table_deck.deck作为参数从main调用其他函数,并且与各个card结构体相关联的存储将是有效的。一旦main退出,该存储将不再有效。
这里使用复合文字只是为了方便。另一种避免复合文字对象存储持续时间的细微差别的方法是简单地直接分配给相关字段。您可以修改card结构体的suit字段,以接受指向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;
    }
    /* ... */
}


如果您选择尝试这样的解决方案,则必须确保您试图复制到suit字段中的任何字符串都适合(包括\0终止符)。您可能希望使用strncpy,但这会带来它自己的问题,因为strncpy可以在没有null终止的情况下离开它的目标数组。
或者你可以保持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;
    }
    /* ... */
}

相关问题