[英]How to use memset function in two dimensional array for initialization of members in C?
我想知道如何在 C 的two dimensional array
中使用memset()
function。
我不想在那個數組中遇到任何垃圾問題。 如何初始化這個數組?
有人可以解釋我如何實現它嗎?
如果您的二維數組具有靜態存儲持續時間,則默認初始化為零,即數組的所有成員都設置為零。
如果二維數組具有自動存儲持續時間,那么您可以使用數組初始值設定項列表將所有成員設置為零。
int arr[10][20] = {0}; // easier way
// this does the same
memset(arr, 0, sizeof arr);
如果動態分配數組,則可以使用memset
將所有字節設置為零。
int *arr = malloc((10*20) * (sizeof *arr));
// check arr for NULL
// arr --> pointer to the buffer to be set to 0
// 0 --> value the bytes should be set to
// (10*20*) * (sizeof *arr) --> number of bytes to be set
memset(arr, 0, (10*20*) * (sizeof *arr));
簡單地:
int array[10][10]={0};
它會將您的所有數組成員初始化為 0。
C99 標准 6.7.8.21:
如果花括號括起來的列表中的初始值設定項少於聚合的元素或成員,或者用於初始化已知大小數組的字符串文字中的字符少於數組中的元素,則聚合的其余部分應隱式初始化與具有靜態存儲持續時間的對象相同。
Alok Save 的答案是最好的答案,因為它適用於任何類型的數組。 您也可以稍后重置數組,例如:
{
T const blank[10][10] = { 0 };
STATIC_ASSERT(sizeof blank == sizeof array);
memcpy(&array, &blank, sizeof array);
}
這適用於所有類型。
如果你真的想使用memset
那么你可以這樣做:
memset(&array, 0, sizeof array);
如果你只有一個指向數組第一個元素的指針,那么:
memset(ptr, 0, number_of_elements * sizeof *ptr);
但是,這些版本將所有字節設置為零,這可能不是浮點類型和指針類型的有效表示。
例如,如果您有整數數組並想顯式使用 memset:
int array[M][N];
您不需要在聲明時使用 { 0 } 進行初始化。
只是
memset(array,0,M*N*sizeof (int));
以上所有都是正確的,因為為了獲得正確的 sizeof 數組,必須先初始化數組。 數組在指針中衰減到一個級別。
以下是要了解何時使用memset()
的important point
:
memset()
允許您通過給定值設置 memory 的各個字節,而不是通過給定值設置整個memory。
int arr[2][3] = { 1,2,3,4,5,6 }; // 1 2 3 4 ... 6
// Works as you expected
memset(arr, 0, sizeof arr); // 0 0 0 0 ... 0
memset(arr, -1, sizeof arr); // -1 -1 -1 -1 ... -1
// Looks strange !!! - Explanation below
memset(arr, 1, sizeof arr); // 16843009 16843009 .... 16843009
memset(arr, 1, sizeof arr);
在內部將 memory 的所有單個字節重置為1 。
例如在 32 位系統中:
00000001 00000001 00000001 00000001 = 0x01010101 = 16843009 != 1 (0x00000001)
相似地
memset(arr, -1, sizeof arr); // -1 -1 -1 -1 ... -1
在內部將 memory 的所有單個字節重置為-1 (1111 1111)。
11111111 11111111 11111111 11111111 = 0xFFFFFFFF = -1
初始化,在 C 中,是一個具體的事情。
初始化發生在定義時,而不是稍后。
int a[M][N] = { 0 }; // Initialization
int b[M][N];
memset(b, 0, sizeof b); // Assignment
OP評論:
這是我定義二維數組的初始化代碼,我必須創建二維動態數組,因此,我以這種方式聲明它。
int **matrix; int
int **matrix; int
**返回;
在這種情況下, matrix
不是二維數組。 它是一個指向指針的指針。
指針不是 arrays。 Arrays 不是指針。
將指針數組分配給歸零的int
數據:
int **matrix = malloc(sizeof matrix[0] * M);
if (matrix) {
for (size_t m = 0; m < M; M++) {
matrix[m] = calloc(N, sizeof matrix[m][0]);
}
}
如果必須使用memset()
:
// matrix[m] = calloc(N, sizeof matrix[m][0]);
matrix[m] = malloc(sizeof matrix[m][0] * N);
memset(matrix[m], 0, sizeof matrix[m][0] * N);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.