C语言:如何使用memset重置动态二维数组?
C language: How to use memset to reset dynamic 2d array?
各位!
我知道calloc
可以在堆上为动态二维数组分配内存并将内存初始化为'\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");
}
...
到目前为止一切正常。然后,我想再次将动态二维数组重置为零:
memset(graph, 0, MAX_NR_VERTICES * MAX_NR_VERTICESdiv8 * sizeof(char));
发生错误。错误信息为:
Unhandled exception at 0x0FDA3FD4 (msvcr120d.dll) in 0xC0000005: Access violation writing location 0x0074F000.
我的程序有什么错误,如果我想重置动态二维数组,这里如何正确使用memset?
我用的是Visual Studio2013(C++)终极版
非常感谢!
您似乎假设为 graph
的元素分配的所有内存都是连续的。这不是一个有效的假设。您需要分别重置 graph
的每个元素的内容:
for(i = 0 ; i < MAX_NR_VERTICES; i++)
memset(graph[i], 0, sizeof(char) * MAX_NR_VERTICESdiv8);
祝你好运。
各位!
我知道calloc
可以在堆上为动态二维数组分配内存并将内存初始化为'\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");
}
...
到目前为止一切正常。然后,我想再次将动态二维数组重置为零:
memset(graph, 0, MAX_NR_VERTICES * MAX_NR_VERTICESdiv8 * sizeof(char));
发生错误。错误信息为:
Unhandled exception at 0x0FDA3FD4 (msvcr120d.dll) in 0xC0000005: Access violation writing location 0x0074F000.
我的程序有什么错误,如果我想重置动态二维数组,这里如何正确使用memset?
我用的是Visual Studio2013(C++)终极版
非常感谢!
您似乎假设为 graph
的元素分配的所有内存都是连续的。这不是一个有效的假设。您需要分别重置 graph
的每个元素的内容:
for(i = 0 ; i < MAX_NR_VERTICES; i++)
memset(graph[i], 0, sizeof(char) * MAX_NR_VERTICESdiv8);
祝你好运。