簡體   English   中英

設置為零二維數組(和其他東西)

[英]Set to zero bidimensional array (and something else)

int x=2,y=2;
int matrix[x][y];

如果我想將數組的每個元素設置為'1',我該怎么辦? 那么,如果我想將第2行的元素設置為零,我可以嗎? 這似乎很容易,但我不知道如何指定行或數組的長度。

memset會在數組的每個byte中放置相同的東西 - 而不是在每個int member中,所以你可以將它用於0,但不能用於1.通過這個,我建議使用循環,即使是0。

通常,在使用數組時,需要循環。 使用2D數組(嵌套數組)時,需要嵌套循環。

int i,j;
//put 1 in every member
for (i=0;i<x;i++)
 for (j=0;j<y;j++)
  matrix[i][j]=1;
//put 0 in the 2nd line
for (j=0;j<y;j++)
 matrix[1][j]=0;

初始化數組(如),讓編譯器在創建變量時設置所有值,只有一種方法:

int matrix[x][y] = 
{
  {1,1},
  {1,1}
};

但是,C中有一個特殊規則允許您將每個數組項設置為零,只需鍵入:

int matrix[x][y] = { 0 };

這個使用零,如果你嘗試使用任何其他值,只有數組的第一項被設置。

然后當然有各種方法在運行時設置數組的項目,如其他答案所示,但這是賦值而不是初始化

編輯:

請注意,以上僅適用於“傳統”靜態分配的數組。 如果使用名為“可變長度數組”的數組聲明功能,則只能在runtme中設置其值。

可變長度數組(vla)是可以在運行時確定其邊界的數組。 在原始問題中,數組長度由運行時的非常數變量x和y確定。 由於數組長度是在運行時確定的,因此所有初始化都必須在運行時完成(使用memset()等)。

請注意,vla僅適用於較新的C標准C99和C11!

初始化整個數組的最佳方法是使用memset()。 你需要使用sizeof()來獲得數組的確切大小; 不要以為你知道int中有多少字節! 你需要將一個指針,一個“字符”和一個大小傳遞給memset()。 警告:memset()是一個鋒利的工具。 它將嘗試將內存塊設置為您指定的值,無論您的進程是否擁有該內存。 警告2:始終,始終檢查函數的返回值。 在memset()的情況下,成功時它應該是傳遞的相同地址(指針)。

這是我如何做到的:

#include <string.h>

char *lpMyMem;

lpMyMem = memset(matrix, (int) '\0', sizeof(int)*x*y;

if lpMyMem != matrix)
{
/* setting memory failed.  display message. */
return(-1); /* or another error code of your choosing! */
}

/* the rest of your program */
int x = 2, y = 2;
int matrix[x][y];

這聲明了一個可變長度數組。 無法初始化可變長度數組:即,

int x = 2, y = 2;
int matrix[x][y] = {0};  // not valid, matrix is a vla

如果可能的話,為尺寸使用常數,你就可以初始化matrix

#define X  2
#define Y  2
int matrix[X][Y] = {{1, 2}, {3, 4}};   // matrix is not a vla, ok

初始化后,您可以使用memset或通過賦值,逐個元素地為數組元素賦值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM