首页 > 解决方案 > 在运行时在 C 中初始化数组

问题描述

我无法找到在运行时初始化二维数组的示例。

这是 perl 中的代码;任何人都可以将这段代码“翻译”成C吗?

  my @grid;     # grid = 2D array
  my $gr=0;     # rows in grid
  my $gc=0;     # cols in grid
  my @ct;
  if( $ARGV[0] eq '5x5' ) {
    $gr=5; $gc=5;    # grid is all zeroes
    @ct=(2,2,2,2,0);
  }
  if( $ARGV[0] eq '9x9' ) {
    $gr=9; $gc=9;    # grid is all zeroes
    @ct=(2,3,4,2,3,5,3,5,3);
  }
  if( $ARGV[0] eq '6x10' ) {
    $gr=6; $gc=10;
    @grid = (
        [0,8,0,0,0,9,3,5,6,7],
        [6,0,0,5,0,7,0,0,1,0],
        [5,0,2,0,4,1,0,0,0,0],
        [0,0,0,0,2,0,0,0,0,1],
        [0,0,0,1,0,0,0,0,0,0],
        [1,5,0,4,2,6,8,0,0,0],
    );
    @ct=(14,41,15,29,26,33,32,27,32,21);
  }

标签: arrayscmultidimensional-arrayinitializationruntime

解决方案


“初始化”只是为对象赋予初始值。要在运行时执行此操作,您可以执行以下任何操作,以及其他可能性:

在定义中初始化,如问题所示:

int myPoints[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };

使用单独的分配进行初始化:

myPoints[0][0] = 1;
myPoints[0][1] = 2;
myPoints[0][2] = 3;
myPoints[1][0] = 4;
myPoints[1][1] = 5;
myPoints[1][2] = 6;
myPoints[2][0] = 7;
myPoints[2][1] = 8;
myPoints[2][2] = 9;

使用计算值的代码进行初始化:

for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j)
    myPoints[i][j] = 3*i + j + 1;

从复合文字复制:

memcpy(myPoints, (const int [3][3]) { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} }, sizeof myPoints);

在第一种情况下(使用定义初始化),如果myPoints是静态对象,编译器可能会将值存储在目标文件中,作为程序加载的一部分进行加载。如果myPoints是一个自动对象,它可能会生成指令来存储数组的值。从技术上讲,C 标准允许编译器对上述任何示例执行其中任何一项。使用哪个是优化和编译器实现的问题。因此,除非性能问题很重要,否则在“运行时”初始化的区别在很大程度上是无关紧要的。


推荐阅读