簡體   English   中英

C語言:如何使用memset重置動態2d數組?

[英]C language: How to use memset to reset dynamic 2d array?

大家!

我知道calloc可以在堆上為動態2d數組分配內存,並將內存初始化為'\\ 0'。 但是,在使用動態數組之后,我想再次將其重置為零。 我寫的源代碼如下:

首先,我將宏定義如下:

#define MAX_NR_VERTICES         5000
#define MAX_NR_VERTICESdiv8     625

#define REPORTERROR(file_name, line_num, message)   \
    printf("[%s--%d] %s\n", file_name, line_num, message)

#define CALLOC(arg, type, num, file_name, line_num, message)    \
if ((arg = (type *)calloc(num, sizeof(type))) == NULL) {    \
    REPORTERROR(file_name, line_num, message);  \
    exit(EXIT_FAILURE); \
}

#define FREE(arg)   \
    free(arg)

然后,我定義了動態數組,並如下使用它:

...
char **graph = NULL;
    CALLOC(graph, char *, MAX_NR_VERTICES, __FILE__, __LINE__, "cannot allocate memory for char **graph in _tmain function.\n");
    for (int i = 0; i < MAX_NR_VERTICES; i++) {
        CALLOC(graph[i], char, MAX_NR_VERTICESdiv8, __FILE__, __LINE__, "cannot allocate memory for char (*g) [] in _tmain function.\n");
    }
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            graph[i][j] = 0x80;
            printf("%d ", graph[i][j]);
        }
        printf("\n");
    }
...

到目前為止,一切都運轉良好。 然后,我想將動態2d數組再次重置為零:

memset(graph, 0, MAX_NR_VERTICES * MAX_NR_VERTICESdiv8 * sizeof(char));

發生錯誤。 錯誤信息是:

Unhandled exception at 0x0FDA3FD4 (msvcr120d.dll) in 0xC0000005: Access violation writing location 0x0074F000.

如果我想重置動態2d數組,程序中的錯誤是什么?如何在此處正確使用memset?

我使用Visual Studio 2013(C ++)終極版。

非常感謝你!

看來您已經假設為graph元素分配的所有內存都是連續的。 這不是一個有效的假設。 您需要分別重置graph的每個元素的內容:

for(i = 0 ; i < MAX_NR_VERTICES; i++)
  memset(graph[i], 0, sizeof(char) * MAX_NR_VERTICESdiv8);

祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM