我想知道如何在C语言中的二维数组中使用memset()
函数。
我不想在这个数组中遇到任何垃圾问题。我该如何初始化这个数组?
有人可以解释一下如何实现吗?
我想知道如何在C语言中的二维数组中使用memset()
函数。
我不想在这个数组中遇到任何垃圾问题。我该如何初始化这个数组?
有人可以解释一下如何实现吗?
如果您的2D数组具有静态储存期,则默认初始化为零,即将数组的所有成员设置为零。
如果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));
(a*b) * (sizeof *arr)
改成sizeof *arr * a * b)
可以避免a*b
溢出,因为sizeof *arr * a
使用size_t
和a
的最宽的类型进行计算。 - chux - Reinstate Monicaint array[M][N];
声明时不需要使用 { 0 } 进行初始化。
就这样。
memset(array,0,M*N*sizeof (int));
memset(array,0,M*N*sizeof(int));
改为memset(array,0,sizeof(int)*M*N);
以防止M*N
的数学溢出。 - chux - Reinstate Monicamemset(array, 0, sizeof array);
。 - chux - Reinstate Monicaint array[M][N]
的M*N*sizeof(int)
非常大时,可能会发生溢出。考虑到M,N
都是0x10000,int/unsigned
为32位,size_t
为64位。M*N
会导致int/unsigned
数学运算溢出--> UB。 - chux - Reinstate Monicaint 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
初始化在C语言中是一个具体的概念。
初始化发生在定义时而不是之后。
int a[M][N] = { 0 }; // Initialization
int b[M][N];
memset(b, 0, sizeof b); // Assignment
OP评论:
这是我定义二维数组的初始化代码,我需要创建二维动态数组,因此我以这种方式声明。
int **matrix; int
**back;
在这种情况下,matrix
不是2D数组,而是指向指针的指针。
指针不是数组。数组也不是指针。
要分配一个指向以零填充的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);
简单来说:
int array[10][10]={0};
这将会将你的数组成员全部初始化为0。
C99标准6.7.8.21:
如果大括号中的初始化值少于聚合体中的元素或成员数量,或者用于初始化已知大小数组的字符串文字中的字符数少于数组中的元素数,则聚合体的其余部分将被隐式初始化为具有静态存储期的对象相同。
memset
。而且,如果要挑剔的话,楼主说“初始化”,从技术上讲,使用memset
并不能“初始化”任何东西,它只是将内存设置为0
。 - 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);