初始化多维数组为单个值

5

有人能够提醒我在C语言中给一个数组赋值的语法,特别是多维数组赋值为一个单一值的情况吗?

我认为花括号可以实现这个功能,但是当我测试时却收到了编译器错误信息:

int ArrayName [5][5] = {1};

将数组初始化为1。


更多阅读。 - Mateen Ulhaq
1
使用花括号,您应该为数组的每个成员提供一个单独的值(缺少的值将设置为0)。我会选择Elalfer的答案,因为它很容易理解。另外,如果您有C ++可用,则可以将向量初始化为多个相同值的副本(尽管在多个维度上可能会很混乱)。另一方面:如果您在堆上分配内存,则可以使用calloc而不是malloc来将内存初始化为0。 - Brandon Bohrer
4个回答

7
在C语言中,没有一种紧凑的语法可以将数组的所有元素初始化为单个值,无论该数组是多维还是单维。有一种特定的语法可以将所有元素设置为零(即= { 0 }),但对于任何其他值来说都是不可能的。
当然,您可以为所有数组元素拼写单独的初始值,但这可能不是您想要的。
您唯一能做的就是手动将所有元素设置为特定值,通过使用赋值。

1

可以使用指向指针的malloc动态构建多维数组。在下面的示例中,声明了一个单一的指向指针的int类型。在声明时,指针没有有意义的值。然后调用mallac请求指针指向nx个有效内存单元的块:

x =  (int **) malloc(nx * sizeof(int *));

在调用此函数后,x现在具有有效值;具体来说,它是一个内存块的起始地址,该内存块包含nx个指向int的指针。每个这样的指针都只是一个常规指针,正如我们以前看到的那样。它们尚未被初始化为任何有意义的内容,并且可以作为任何一个访问。
x[0], x[1] ... x[nx-1], OR *x, *(x+1), *(x+2),
  ... *(x+nx-1).

为了给这些指针赋予有意义的值,我们可以为它们中的每一个调用malloc,就像这个循环所完成的那样:
 for (i=0;i<nx;++i){
    x[i] = ( int * ) malloc( ny * sizeof(int));
  }

请注意,我们也可以这样说:
for (i=0;i<nx;++i){
    *(x+i) = ( int * ) malloc( ny * sizeof(int));
  }

现在我们指向指针数组中的每个指针都指向一个有意义的内存块(每个块的大小为ny int),我们可以分配值。要了解如何分配值,请考虑下面的示意图。您需要仔细研究此内容,直到非常清楚正在发生什么。这可能有点棘手,但一旦你掌握了它,它就不那么糟糕了。

  x[0] --->   | *x[0] | *x[0]+1 | *x[0] + 2 | ... | *x[0]+ny-1 |
  x[1] --->   | *x[1] | *x[1]+1 | *x[1] + 2 | ... | *x[1]+ny-1 |

  .
  .
  .
  x[nx-1] ---> | *x[nx-1] | *x[nx-1]+1 | *x[nx-1] + 2 | ... | *x[nx-1]+ny-1 |

这相当于:

  x[0] --->   | *(*(x+0)+0) | *(*(x+0)+1) | *(*(x+0)+2) | ... | *(*(x+0)+ny-1) |
  x[1] --->   | *(*(x+1)+0) | *(*(x+1)+1) | *(*(x+1)+2) | ... | *(*(x+1)+ny-1) |
  .
  .
  .
  x[nx-1] --->   | *(*(x+nx-1)+0) | *(*(x+nx-1)+1) | *(*(x+nx-1)+2) | ... | *(*(x+nx-1)+ny-1) |

这相当于:

  x[0] --->   | x[0][0] | x[0][1] | x[0][2] | ... | x[0][ny-1] |
  x[1] --->   | x[1][0] | x[1][1] | x[1][2] | ... | x[1][ny-1] |
  .
  .
  .
  x[nx-1] ---> | x[nx-1][0] | x[nx-1][1] | x[nx-1][2] | ... | x[nx-1][ny-1] |

...鉴于重要关系:

 *( *(x + i) + j) = *( x[i] + j) = x[i][j]

1
你可以这样做:
int ArrayName[5][5];

for(size_t i = 0; i < 5; i++)
    for(size_t i2 = 0; i2 < 5; i2++)
        ArrayName[i][i2] = 1;

或者更高效的方式是:

int ArrayName[5][5];

for(size_t i = 0, *ptr = ArrayName; i < (5*5); ++i, ++ptr)
    *ptr = 1;

如果你够疯狂,你可以为此创建一个函数:
void init_arr(void* ptr, void* value, size_t size)
{
    for(size_t i = 0; i < size; ++i, ++ptr)
        *ptr = *value;
}

int ArrayName[5][5];
int val = 1;
init_arr(ArrayName, val, 5 * 5);

如果你正在使用C ++,你可能会使用模板:
template <class T>
void init_arr(T *ptr, T value, size_t size)
{
    for(size_t i = 0; i < size; ++i, ++ptr)
        *ptr = value;
}

int ArrayName[5][5];
init_arr(ArrayName, 1, 5 * 5);

如果你真的在使用C++,你应该使用向量... 哎呀,可能有一种花哨的boost方法可以做到这一点。 :)


1

我不确定这是否可能。您应该使用forwhile循环。

如果您想用单个字节填充内存,可以使用memset函数。


使用 int ArrayName[5][5] = {1}; 是合法的,但它不会做你期望的事情 - Mateen Ulhaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接