在 C 中调整二维数组的大小。内存泄漏
Resizing a two dimensional array in C. Memory leak
所以我有一个二维动态数组,我必须调整它的大小。在我调整它的大小之后,编译器说它不能通过这样的格式访问内存:array[i][j]
void resize(int **array,int newsize,int size){
int newarraysize=WINDOWY/newsize;
int arraysize=WINDOWY/size;
array= (int**)realloc(array,(newarraysize*sizeof(int*)));
if(newarraysize>arraysize){
for(int i=0; i<arraysize; i++)
array[i]=(int*)realloc(tomb[i],(newarraysize*sizeof(int)));
}
else{
for(int i=0; i<newarraysize; i++)
array[i]=(int*)realloc(tomb[i],(newarraysize*sizeof(int)));
}
printf("\n");
for(int i=0;i<newarraysize;i++)
{
for(int j=0;j<newarraysize;j++)
printf("[%d][%d]: %p ",i,j,&array[i][j]);
printf("\n");
}
}
如果newsize较小,则newsize到size的元素必须释放
然后可以重新分配数组。
如果newsize比较大,size到newsize的元素需要设置为NULL。
然后从元素 0 重新分配到 newsize。
对于指向指针的指针,可以返回和分配指针。另一种选择是将指针传递给指针 int ***array
.
#include <stdio.h>
#include <stdlib.h>
int **resize ( int **array, int *newsize, int size){
int **temp = NULL;
if ( *newsize < size) {
for ( int i = *newsize; i < size; i++) {
printf ( "free[%d]\n", i);
free ( array[i]);
}
}
if ( NULL == ( temp = realloc ( array, *newsize * sizeof *array))) {
if ( 0 != *newsize) {
fprintf ( stderr, "realloc problem\n");
*newsize = size;
return array;
}
else {
return NULL;
}
}
array = temp;
for ( int i = size; i < *newsize; i++) {
array[i] = NULL;
}
for ( int i = 0; i < *newsize; i++) {
array[i] = realloc ( array[i], *newsize * sizeof **array);
}
printf("\n");
for ( int i = 0; i < *newsize; i++) {
for ( int j = 0; j < *newsize; j++) {
printf ( "[%d][%d]: %p\n", i, j, (void *)&array[i][j]);
}
}
return array;
}
int main ( void) {
char line[6] = "";
int **items = NULL;
int elements = 0;
int oldsize = 0;
printf ( "enter a number\n");
while ( fgets ( line, sizeof line, stdin)) {
if ( 1 == sscanf ( line, "%d", &elements)) {
if ( 0 <= elements) {
items = resize ( items, &elements, oldsize);
oldsize = elements;
}
if ( 0 == elements) {
free ( items);
break;
}
}
else {
printf ( "enter a number\n");
}
}
return 0;
}
所以我有一个二维动态数组,我必须调整它的大小。在我调整它的大小之后,编译器说它不能通过这样的格式访问内存:array[i][j]
void resize(int **array,int newsize,int size){
int newarraysize=WINDOWY/newsize;
int arraysize=WINDOWY/size;
array= (int**)realloc(array,(newarraysize*sizeof(int*)));
if(newarraysize>arraysize){
for(int i=0; i<arraysize; i++)
array[i]=(int*)realloc(tomb[i],(newarraysize*sizeof(int)));
}
else{
for(int i=0; i<newarraysize; i++)
array[i]=(int*)realloc(tomb[i],(newarraysize*sizeof(int)));
}
printf("\n");
for(int i=0;i<newarraysize;i++)
{
for(int j=0;j<newarraysize;j++)
printf("[%d][%d]: %p ",i,j,&array[i][j]);
printf("\n");
}
}
如果newsize较小,则newsize到size的元素必须释放
然后可以重新分配数组。
如果newsize比较大,size到newsize的元素需要设置为NULL。
然后从元素 0 重新分配到 newsize。
对于指向指针的指针,可以返回和分配指针。另一种选择是将指针传递给指针 int ***array
.
#include <stdio.h>
#include <stdlib.h>
int **resize ( int **array, int *newsize, int size){
int **temp = NULL;
if ( *newsize < size) {
for ( int i = *newsize; i < size; i++) {
printf ( "free[%d]\n", i);
free ( array[i]);
}
}
if ( NULL == ( temp = realloc ( array, *newsize * sizeof *array))) {
if ( 0 != *newsize) {
fprintf ( stderr, "realloc problem\n");
*newsize = size;
return array;
}
else {
return NULL;
}
}
array = temp;
for ( int i = size; i < *newsize; i++) {
array[i] = NULL;
}
for ( int i = 0; i < *newsize; i++) {
array[i] = realloc ( array[i], *newsize * sizeof **array);
}
printf("\n");
for ( int i = 0; i < *newsize; i++) {
for ( int j = 0; j < *newsize; j++) {
printf ( "[%d][%d]: %p\n", i, j, (void *)&array[i][j]);
}
}
return array;
}
int main ( void) {
char line[6] = "";
int **items = NULL;
int elements = 0;
int oldsize = 0;
printf ( "enter a number\n");
while ( fgets ( line, sizeof line, stdin)) {
if ( 1 == sscanf ( line, "%d", &elements)) {
if ( 0 <= elements) {
items = resize ( items, &elements, oldsize);
oldsize = elements;
}
if ( 0 == elements) {
free ( items);
break;
}
}
else {
printf ( "enter a number\n");
}
}
return 0;
}