繁体   English   中英

使用memset在C中初始化2d数组

[英]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]);
    }
}

如果知道编译时的数组大小(如果25是实际常量),则还可以使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]);
    }
}

请注意,在原始代码中,还存在将指针返回到arrarr是局部变量,使指针立即悬空。

这是一个指针数组。 您可以确定两件事

  • 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM