C中如何使用二维数组中的memset函数初始化成员?

a14dhokn  于 2022-12-17  发布在  其他
关注(0)|答案(6)|浏览(150)

我想知道如何在C语言的two dimensional array中使用memset()函数。
我不想在那个数组中遇到任何垃圾问题。我该如何初始化这个数组?
有人能告诉我怎么做吗?

tvz2xvvm

tvz2xvvm1#

如果二维数组具有静态存储持续时间,则默认情况下将其初始化为零,即数组的所有成员都设置为零。
如果2D数组具有自动存储持续时间,则可以使用数组初始化器列表将所有成员设置为零。

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));
5kgi1eie

5kgi1eie2#

例如,如果你有一个整数数组,并且想显式使用memset:

int array[M][N];

不需要使用{ 0 }初始化at声明。
公正

memset(array,0,M*N*sizeof (int));

以上都是正确的,因为为了得到正确的数组大小,数组必须先被初始化,并且数组在指针中衰减到一级。

rsl1atfo

rsl1atfo3#

简而言之:

int array[10][10]={0};

它会将所有数组成员初始化为0。

C99标准6.7.8.21:

如果用大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文本中的字符少于数组中的元素,则聚合的其余部分应隐式初始化为与具有静态存储持续时间的对象相同。

egmofgnx

egmofgnx4#

Alok保存的答案是最好的,因为它适用于任何类型的阵列。您也可以稍后重置阵列,例如:

{
    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);

但是,这些版本将all-bytes-zero设置为可能不是浮点类型和指针类型的有效表示形式。

6ie5vjzr

6ie5vjzr5#

下面是一个important point了解什么时候要使用memset()
memset()允许您按给定值设置内存的单个字节,而按给定值设置整个内存。

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);在内部将内存的所有单个字节重置为1
例如,在32位系统中:

00000001 00000001 00000001 00000001 = 0x01010101 = 16843009 != 1 (0x00000001)

同样

memset(arr, -1, sizeof arr);     // -1  -1  -1  -1 ... -1

在内部将存储器的所有单个字节重置为**-1**(1111 1111)。

11111111 11111111 11111111 11111111 = 0xFFFFFFFF = -1
0s7z1bwu

0s7z1bwu6#

在C语言中,* 初始化 * 是一个特定的东西。

  • 初始化 * 发生在定义时,而不是之后。
int a[M][N] = { 0 };  // Initialization

int b[M][N];
memset(b, 0, sizeof b);  // Assignment

OP备注:
这是我定义二维数组的初始化代码,我必须创建二维动态数组,因此,我以这种方式声明它。int **matrix; int**back;
在这个例子中,matrix不是一个二维数组,它是一个指向指针的指针。
指针不是数组。数组不是指针。
要将指针数组分配给零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);

相关问题