[英]Initializing 2d array in C using memset
使用memset初始化二维数组后,打印二维数组时出现异常。 如果我初始化每个元素然后访问它,则没有错误。 请帮助找出代码中的错误。
#include "stdafx.h"
#include "stdlib.h"
int r = 0;
int c = 0;
int **twoDArray() {
int *arr[5];
for (r = 0; r < 5; r++) {
arr[r] = (int*)malloc(2 * sizeof(int));
}
//
for (r = 0; r < 5; r++) {
for (c = 0; c < 2; c++) {
arr[r][c] = 1;
printf("%d \n", arr[r][c]);
}
}
memset(arr, 0, 2 * 5 * sizeof(arr[0][0]));
for (r = 0; r < 5; r++) {
for (c = 0; c < 2; c++) {
printf("%d \n", arr[r][c]); //getting exception here.
}
}
return arr;
}
int main()
{
int **arr;
arr = twoDArray();
for (r = 0; r < 5; r++) {
for (c = 0; c < 2; c++) {
arr[r][c] = 0;
printf("%d \n", arr[r][c]);
}
}
return 0;
}
您没有2D阵列。 您有一个1D数组,指向1D数组。 这些阵列中的每一个都可以(并且可能有99.9%)位于内存中的不同地址。 因此,您不能像memset
一样将它们视为一个连续的块。
最好的(也是最适合缓存的)选项是动态分配整个数组:
int *arr = malloc(2 * 5 * sizeof(int));
这将需要您然后进行手动索引编制:
for (r = 0; r < 5; r++) {
for (c = 0; c < 2; c++) {
arr[r * 2 + c] = 1;
printf("%d \n", arr[r * 2 + c]);
}
}
如果知道编译时的数组大小(如果2
和5
是实际常量),则还可以使arr
指向实际数组的指针,以允许进行语法2D索引:
typedef int Array[2];
Array *arr = malloc(5 * sizeof(Array));
for (r = 0; r < 5; r++) {
for (c = 0; c < 2; c++) {
arr[r][c] = 1;
printf("%d \n", arr[r][c]);
}
}
请注意,在原始代码中,还存在将指针返回到arr
, arr
是局部变量,使指针立即悬空。
这是一个指针数组。 您可以确定两件事
arr[0]
至arr[4]
是连续的。 但是谁告诉你每个指针所指向的每个malloc分配的内存块也是连续的呢? 没有人做。 你以为错了
在您的情况下 , 绝对不是这样。 这就是为什么您通过访问内存超出范围来调用未定义的行为的原因。 (在memset
)。
虽然这样做-它将起作用
int (*arr)[2];
arr = malloc(sizeof *arr * 5);
// do memset - it's fine.
不要转换malloc
的返回值。 这是多余的。
在较早的情况下是这样的:
+-------------+
+-------+ +------>+ arr[0][0] |
arr[0] | | | | | arr[0][1]
| +-------------+ +------+------+
+-------+
| | +------+------+
arr[1] | +------->+ | |
+-------+ | | |
| | +-------------+ +------+------+
arr[2] | +-------------------------------------+ | |
+-------+ | | |
| | | +------+------+ +------+------+
arr[3] | +------------------>+ | |
+-------+ | | |
| | +------+------+
arr[4] | + |
+-------+
| +------+------+
+----------------------->+ | |
| | |
+------+------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.