动态列和行大小的二维数组在 c 编程的递归函数中更新
Both dynamic column and row sized 2D array updated in recursive function in c programming
我在 C 编程中通过它的列和行大小来增长一个二维数组。
#include <stdio.h>
#include <malloc.h>
//#include <conio.h>
//#include <stdlib.h>
void func(int** p, int d, int** sizes)
{
static int count = 0;
int* item = NULL;
int* temp = NULL;
if (d == 5) return;
*sizes = (int*) realloc(*sizes, (d + 1) * sizeof(*sizes));
*sizes[count] = d + 1; // <=== in second recursive call it throws memory allocation errors here in runtime
//p = (int**) realloc(p, (count + 1) * sizeof(int*));
//printf("%d\n", *sizes[count]);
//item = (int*) realloc(*(p + d) , *sizes[count] * sizeof(int));
//if (item) *(p + *sizes[count]) = item;
++count;
func(p, d + 1, sizes);
}
int main()
{
int* sizes = (int*) malloc(sizeof(int)); // different column sizes of rows
int** p = (int**) malloc(sizeof(int*));
*p = (int*) malloc(sizeof(int));
printf("Hello World!\n");
func(p, 0, &sizes);
printf("Hello End!\n");
getchar();
free(p);
return 0;
}
但是我陷入了内存分配错误。
有人可以帮忙吗?我以错误的方式使用 realloc() 吗?请指出我的错误。实际上我打算解决 leetcode.com 中的一个问题,我需要在 c 编程中使用可变列大小的二维数组。因此,我认为这个头脑风暴将帮助我首先理解动态二维数组。然后我会进入真正的问题。
编辑:
#include <stdio.h>
#include <malloc.h>
//#include <conio.h>
//#include <stdlib.h>
void __cdecl func(int** p, int d, int** sizes, int* rows)
{
int* item = NULL;
if (d == 5) return;
*sizes = (int*) realloc(*sizes, (d + 1) * sizeof(*sizes));
(*sizes)[*rows] = d + 1;
p = (int**) realloc(p, (*rows + 1) * sizeof(int*));
printf("%d\n", (*sizes)[*rows]);
item = (int*) malloc((*sizes)[*rows] * sizeof(int));
item = (int*) realloc(item , (*sizes)[*rows] * sizeof(int));
if (item) *(p + *rows) = item;
p[*rows][(*sizes)[*rows] - 1] = 1;
printf("item[%d][%d]: %d\n", *rows, (*sizes)[*rows] - 1, p[*rows][(*sizes)[*rows] - 1]);
++(*rows);
func(p, d + 1, sizes, rows);
}
int main()
{
int rows = 0, i = 0, j = 0;
int* sizes = (int*) malloc(sizeof(int));
int** p = (int**) malloc(sizeof(int*));
*p = (int*) malloc(sizeof(int));
printf("Hello World!\n");
func(p, 0, &sizes, &rows);
printf("Hello End!\n");
for (; i < rows; ++i)
{
int j = sizes[i] - 1;
printf("p[%d][%d]\n", i, j, p[i][j]); // CAN'T ACCESS HERE
}
//for (; i < rows; ++i)
//{
// if (*(p + i))
// {
// free(*(p + i));
// *(p + i) = NULL;
// }
//}
//free(p);
//free(sizes);
getchar();
return 0;
}
当递归函数退出执行时,我无法访问数组。
我打印了仅在递归期间分配的二维数组的对角线值。但在外面它显示访问冲突。
*sizes[count]
不是指你在这里所期望的。运算符优先级首先是 size[count]
,然后才应用 *
运算符。要获得您期望的结果,您必须使用:
(*sizes)[count] = d + 1;
如果您想重复使用它们,也必须将其应用于您的评论部分。
如果你们都好奇我在这里的最终结果是什么:
#include <stdio.h>
#include <malloc.h>
//#include <conio.h>
//#include <stdlib.h>
struct ARR
{
int** p;
};
void __cdecl func(struct ARR* arr, int d, int** sizes, int* rows)
{
int* item = NULL;
int iCol = 0;
if (d == 5) return;
*sizes = (int*) realloc(*sizes, (d + 1) * sizeof(*sizes));
(*sizes)[*rows] = d + 1;
printf("%d=>%d\n", *rows, (*sizes)[*rows]);
arr->p = (int**) realloc(arr->p, (*rows + 1) * sizeof(int*));
item = (int*) malloc(sizeof(int));
item = (int*) realloc(item , (*sizes)[*rows] * sizeof(int));
if (item) *(arr->p + *rows) = item;
iCol = (*sizes)[*rows] - 1;
arr->p[*rows][iCol] = 1;
printf("item[%d][%d]: %d\n", *rows, iCol, arr->p[*rows][iCol]);
++(*rows);
func(arr, d + 1, sizes, rows);
}
int main()
{
int rows = 0, i = 0, j = 0;
struct ARR arr;
int* sizes = (int*) malloc(sizeof(int));
arr.p = (int**) malloc(sizeof(int*));
*(arr.p) = (int*) malloc(sizeof(int));
printf("Hello World!\n");
func(&arr, 0, &sizes, &rows);
printf("Hello End!\n");
for (; i < rows; ++i)
{
int j = sizes[i] - 1;
printf("p[%d][%d]=%d\n", i, j, arr.p[i][j]);
}
for (; i < rows; ++i)
{
int j = sizes[i] - 1;
free(arr.p[i]);
arr.p[i] = NULL;
}
free(arr.p);
free(sizes);
getchar();
return 0;
}
我希望许多程序员能从这次讨论中得到宝贵的帮助。
我在 C 编程中通过它的列和行大小来增长一个二维数组。
#include <stdio.h>
#include <malloc.h>
//#include <conio.h>
//#include <stdlib.h>
void func(int** p, int d, int** sizes)
{
static int count = 0;
int* item = NULL;
int* temp = NULL;
if (d == 5) return;
*sizes = (int*) realloc(*sizes, (d + 1) * sizeof(*sizes));
*sizes[count] = d + 1; // <=== in second recursive call it throws memory allocation errors here in runtime
//p = (int**) realloc(p, (count + 1) * sizeof(int*));
//printf("%d\n", *sizes[count]);
//item = (int*) realloc(*(p + d) , *sizes[count] * sizeof(int));
//if (item) *(p + *sizes[count]) = item;
++count;
func(p, d + 1, sizes);
}
int main()
{
int* sizes = (int*) malloc(sizeof(int)); // different column sizes of rows
int** p = (int**) malloc(sizeof(int*));
*p = (int*) malloc(sizeof(int));
printf("Hello World!\n");
func(p, 0, &sizes);
printf("Hello End!\n");
getchar();
free(p);
return 0;
}
但是我陷入了内存分配错误。
编辑:
#include <stdio.h>
#include <malloc.h>
//#include <conio.h>
//#include <stdlib.h>
void __cdecl func(int** p, int d, int** sizes, int* rows)
{
int* item = NULL;
if (d == 5) return;
*sizes = (int*) realloc(*sizes, (d + 1) * sizeof(*sizes));
(*sizes)[*rows] = d + 1;
p = (int**) realloc(p, (*rows + 1) * sizeof(int*));
printf("%d\n", (*sizes)[*rows]);
item = (int*) malloc((*sizes)[*rows] * sizeof(int));
item = (int*) realloc(item , (*sizes)[*rows] * sizeof(int));
if (item) *(p + *rows) = item;
p[*rows][(*sizes)[*rows] - 1] = 1;
printf("item[%d][%d]: %d\n", *rows, (*sizes)[*rows] - 1, p[*rows][(*sizes)[*rows] - 1]);
++(*rows);
func(p, d + 1, sizes, rows);
}
int main()
{
int rows = 0, i = 0, j = 0;
int* sizes = (int*) malloc(sizeof(int));
int** p = (int**) malloc(sizeof(int*));
*p = (int*) malloc(sizeof(int));
printf("Hello World!\n");
func(p, 0, &sizes, &rows);
printf("Hello End!\n");
for (; i < rows; ++i)
{
int j = sizes[i] - 1;
printf("p[%d][%d]\n", i, j, p[i][j]); // CAN'T ACCESS HERE
}
//for (; i < rows; ++i)
//{
// if (*(p + i))
// {
// free(*(p + i));
// *(p + i) = NULL;
// }
//}
//free(p);
//free(sizes);
getchar();
return 0;
}
当递归函数退出执行时,我无法访问数组。 我打印了仅在递归期间分配的二维数组的对角线值。但在外面它显示访问冲突。
*sizes[count]
不是指你在这里所期望的。运算符优先级首先是 size[count]
,然后才应用 *
运算符。要获得您期望的结果,您必须使用:
(*sizes)[count] = d + 1;
如果您想重复使用它们,也必须将其应用于您的评论部分。
如果你们都好奇我在这里的最终结果是什么:
#include <stdio.h>
#include <malloc.h>
//#include <conio.h>
//#include <stdlib.h>
struct ARR
{
int** p;
};
void __cdecl func(struct ARR* arr, int d, int** sizes, int* rows)
{
int* item = NULL;
int iCol = 0;
if (d == 5) return;
*sizes = (int*) realloc(*sizes, (d + 1) * sizeof(*sizes));
(*sizes)[*rows] = d + 1;
printf("%d=>%d\n", *rows, (*sizes)[*rows]);
arr->p = (int**) realloc(arr->p, (*rows + 1) * sizeof(int*));
item = (int*) malloc(sizeof(int));
item = (int*) realloc(item , (*sizes)[*rows] * sizeof(int));
if (item) *(arr->p + *rows) = item;
iCol = (*sizes)[*rows] - 1;
arr->p[*rows][iCol] = 1;
printf("item[%d][%d]: %d\n", *rows, iCol, arr->p[*rows][iCol]);
++(*rows);
func(arr, d + 1, sizes, rows);
}
int main()
{
int rows = 0, i = 0, j = 0;
struct ARR arr;
int* sizes = (int*) malloc(sizeof(int));
arr.p = (int**) malloc(sizeof(int*));
*(arr.p) = (int*) malloc(sizeof(int));
printf("Hello World!\n");
func(&arr, 0, &sizes, &rows);
printf("Hello End!\n");
for (; i < rows; ++i)
{
int j = sizes[i] - 1;
printf("p[%d][%d]=%d\n", i, j, arr.p[i][j]);
}
for (; i < rows; ++i)
{
int j = sizes[i] - 1;
free(arr.p[i]);
arr.p[i] = NULL;
}
free(arr.p);
free(sizes);
getchar();
return 0;
}
我希望许多程序员能从这次讨论中得到宝贵的帮助。