【问题标题】:Initializing variable length array [duplicate]初始化可变长度数组[重复]
【发布时间】:2013-06-24 07:37:24
【问题描述】:

在初始化可变长度数组时,编译器会给出错误消息:

[Error] variable-sized object may not be initialized  

代码sn-p:

int n; 
printf("Enter size of magic square: ");
scanf("%d",&n);

int board[n][n] = {0};

变长数组应该如何初始化? 以及为什么它的所有元素都没有按照下面给出的方式初始化为0

   int board[n][n];
   board[n][n] = {0};

?

【问题讨论】:

    标签: c variable-length-array array-initialization


    【解决方案1】:

    你必须使用memset:

    memset(board, 0, sizeof board);
    

    【讨论】:

    • 我不知道memset()
    • 这是什么意思?
    • @hacks 你只是把它放在int board[n][n]; 行下面。并确保你#include <string.h>
    • #include <string.h> for C.
    • 你想把它初始化为0,对吧?
    【解决方案2】:

    VLA 不能通过任何形式的初始化语法初始化。您必须在声明之后以您喜欢的任何方式分配初始值给数组元素。

    C11:6.7.9 初始化(p2 和 p3):

    任何初始化器都不应尝试为未包含在正在初始化的实体中的对象提供值。

    要初始化的实体的类型应该是一个未知大小的数组或一个完整的对象类型不是变长数组类型

    【讨论】:

    • 你的意思是说int board[n][n];board[n][n] = {0};。对吗?
    • @hacks:不,数组是不可分配的。这就是为什么我说“将初始值分配给您的数组元素”。除非像memsetmemcpy 这样的原始内存操作,它必须以逐个元素的方式完成。所以,我的意思是说for (i = 0; i < n; ++i) ...等等。
    • 我读到该数组可以初始化为array[m][n] = {0},这会将其第一个元素初始化为0,其余元素将初始化为0本身。
    • @hacks: "Initialized" 意味着 = { 0 } 可以在声明中指定为初始化程序。您在第一条评论中的内容完全不正确。即使在声明中,它也仅适用于非 VLA 数组。例如,您可以使用int array[10][10] = { 0 }。然而,这个问题专门针对 VLA 阵列。 VLA 数组不接受初始值设定项。当mn 不是常量时,你不能做int array[m][n] = { 0 }
    【解决方案3】:

    1.你可以简单地初始化数组如下-

    int n; 
    printf("Enter size of magic square: ");
    scanf("%d",&n);
    
    int board[n][n];
    for(int i=0; i<n; i++)
       for(int j=0; j<n; j++)
       {
          board[i][j] = 0;
       }
    }
    

    2。 memset() 仅应在您要将数组设置为“0”时使用。

    【讨论】:

    • "... memset() 仅在您想将数组设置为“0”时使用。“Hu!为什么会这样?
    • @alk :memset() 函数用常量字节 c 填充 s 指向的内存区域的前 n 个字节。而整数的大小通常为 4 个字节,因此我们无法将整数设置为所需的数字,但“0”是一种特殊情况,因为使用“0”,memset() 将所有字节设置为“0”。
    • @ParagGangil; memset() 仅在您想将数组设置为“0”时使用Not true.
    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2013-09-22
    • 1970-01-01
    • 2020-04-12
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多