对于一个学校项目,我们必须制作一个需要使用内存分配的特定程序。我使用int *** array
,但是当我为它声明要使用的内存时,我无法使它正常工作。我想这是因为在某个时刻,我调用了尚未分配的内存,尽管我找不到哪里。数组始终为3*size*unknown size
,其中未知项在程序运行时动态分配。
arr = (int***)realloc(arr, sizeof(int**) * 3);
for (int n = 0; n < 3; n++) {
arr[n] = (int**)realloc(arr[n], sizeof(int*) * size);
}
for (int n = 1; n < 3; n++) {
for (int x = 0; x < size; x++) {
arr[n][x] = (int*)realloc(arr[n][x], sizeof(int));
arr[n][x][0] = n - 1;
}
}
谢谢你的帮助。
如果要更改内存大小,您需要先使用malloc
,然后使用realloc
。
阵列总是3*大小*未知大小的
首先,您最初使用malloc
分配内存
int main (void)
{
int val = 1;
int LENGTH = 4;
const int SIZE = 10;
int ** arr[3];
for(int i=0; i < 3; i++)
{
arr[i] = (int**)malloc(sizeof(int*)*SIZE);
for (int j=0; j < SIZE; j++)
{
arr[i][j] = (int*)malloc(sizeof(int)*LENGTH);
for (int k=0; k < LENGTH; k++)
{
arr[i][j][k] = val++;
}
}
}
然后,当您想使用realloc
调整内存大小时
val = 1;
LENGTH = 8;
for(int i=0; i < 3; i++)
{
for (int j=0; j < SIZE; j++)
{
arr[i][j] = (int*)malloc(arr[i][j], sizeof(int)*LENGTH);
for (int k=0; k < LENGTH; k++)
{
arr[i][j][k] = val++;
}
}
}
然后你可以通过打印数组中的值来测试它
for(int i=0; i < 3; i++)
{
printf("---------- %d ----------n", i);
for (int j=0; j < SIZE; j++)
{
for (int k=0; k < LENGTH; k++)
{
printf(" %d", arr[i][j][k]);
}
printf("n");
}
printf("---------- %d ----------nn",i);
}
然后,当您完成阵列时,您可以使用free
释放内存
for(int i=0; i < 3; i++)
{
for (int j=0; j < SIZE; j++)
{
free(arr[i][j]);
}
free(arr[i]);
}
return 0;
}
如果只有最后一个维度是未知的,那么您可以编写更简单的代码:
#define lengthof(array) ( sizeof(array) / sizeof ((array)[0]) )
int *arr[3][size];
然后将它们全部设置为已知状态:
for (size_t i = 0; i != lengthof(arr); ++i)
for (size_t j = 0; j != lengthof(arr[i]); ++j)
arr[i][j] = 0;
然后更改大小:
for (size_t i = 0; i != lengthof(arr); ++i)
for (size_t j = 0; j != lengthof(arr[i]); ++j)
{
void *temp = realloc(arr[i][j], unknown_size * sizeof *arr[i][j])) )
if ( !temp )
exit(EXIT_FAILURE); // or other error handling
arr[i][j] = temp;
}
注:。如果将此分配代码放入函数中,请小心。
在我看来,您的代码是C++:
int main()
{
int a, b, c;
int*** arr = new int**[a];
for (int i = 0;i < a;i++)
{
arr[i] = new int*[b];
for (int j = 0;j < b;j++)
{
arr[i][j] = new int[c];
}
}
}