用C编程,如何声明未知大小的数组以供以后使用?

Posted

技术标签:

【中文标题】用C编程,如何声明未知大小的数组以供以后使用?【英文标题】:Programming in C, How to declare array of unknown size to be used later? 【发布时间】:2018-05-04 05:42:48 【问题描述】:

我正在为一个简单的纸牌游戏创建一个 AI 播放器。

scanf 会输入合法牌的数量。 然后我想创建一个该大小的数组。

但是,如果用户输入为 0,我添加了一个 if 语句来防止错误。(因为您无法创建指向大小为 0 的数组。)

我的问题是......因为我在 if 语句中创建了它,所以我无法在 if 语句之外访问它。当我尝试在我的 Mac 上使用 Xcode 进行编译时,警告“使用未声明的标识符 'legal_cards'”显示了这一点。

我很想获得有关如何更好地编写此程序的建议。 (我仍然需要使用scanf来获取输入,但也许有更好的方法o

是否只有在 if 语句中包含与数组相关的所有代码?或者我可以稍后使用它(使用另一个 if 语句检查以确保 (n_legal_cards > 0)

#include <stdio.h>

int main (void) 
    int n_legal_cards;

    printf("How many legal cards are there?\n");
    scanf("%d", &n_legal_cards);

    if (n_legal_cards > 0) 
        int legal_cards[n_legal_cards];
    

    /*
    ...
    [scanning other variables in here]
    [a little bit of other code here]
    ...
    */


    if (n_legal_cards > 0) 
        int rounds_suit = legal_cards[0];
    

    return 0;

【问题讨论】:

如果数组大小为零或小于零,您不想继续您的程序。你?在那种情况下,为什么不检查大小是否是有效值,如果不是,则返回或退出。然后在主块本身中声明数组。 不要使用可变长度数组 (VLA),而是考虑使用合适的已分配动态内存。如果您坚持使用 VLA,我建议在您的问题中明确澄清这一点,也许给出一个理由。 避免使用 scanf 作为输入,使用 fgets 然后 sscanf 代替 【参考方案1】:

您可以使用动态内存分配,这将允许您声明一个未知大小的数组以供以后使用at runtime

这是您可以做什么的示例:

#include <stdio.h>

int main (void) 
int n_legal_cards;
int* legal_cards;

printf("How many legal cards are there?\n");
scanf("%d", &n_legal_cards);

if (n_legal_cards > 0) 

    legal_cards = malloc(n_legal_cards * sizeof(int));




 /*
 ...
[scanning other variables in here]
[a little bit of other code here]
...
 */


if (n_legal_cards > 0) 
int rounds_suit = legal_cards[0];



    return 0;

【讨论】:

在最后一个 if 语句中,我会检查 if(legal_cards != NULL)...。 最后一段代码我没有真正看懂。。我只是考虑了动态分配部分 这正是我想要的,但不知道怎么做!感谢! :) :)【参考方案2】:

所以,如果我说得对,0 是无效的用户输入。所以只需循环检查,直到用户输入number &gt; 0

//init the variable with 0
int n_legal_cards = 0;

//loop scanf until number > 0 is entered
while (true) 

    printf ("How many legal cards are there?\n");
    scanf ("%d", &n_legal_cards);

    if (n_legal_cards <= 0)
        printf ("Please enter a number > 0\n");
    else
        break;



//then init your array
int legal_cards[n_legal_cards];

【讨论】:

非常感谢您的回答!只是为了澄清 0 将是一个有效的用户输入。 (即可能有 0 张合法牌)。在这种情况下,这一轮将没有特定的花色。

以上是关于用C编程,如何声明未知大小的数组以供以后使用?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中“T 的未知边界数组”的外部声明

使用ctypes python包装C函数返回未知大小的数组

c中可以定义变长数组吗

如何编组包含未知大小的 int 数组的结构?

c++中用new给未知大小的数组分配空间怎么弄?

声明一个大小未知的多维数组