gpt4 book ai didi

c - 当分配动态分配的 3D 数组时,程序会崩溃

转载 作者:行者123 更新时间:2023-11-30 19:37:16 25 4
gpt4 key购买 nike

我编写了一些关于使用 GCC 编译器在代码块上动态分配 3D 数组的代码。

版本1:

void*** alloc3(int n_s, int n_row, int n_col, int size)
{
void*** p=(void***)malloc(n_s*sizeof(void**));
int i,j,k;
if (p==NULL) return NULL;
for(i=0;i<n_s;i++){
p[i] = (void**)malloc(n_row*sizeof(void*));
for(j=0;j<n_row;j++)
{
p[i][j]=(char*)malloc(n_col*size);
if(p[i][j]==NULL) {free(p[0]);free(p);return NULL; }
}
}
return p;
}

版本2:

void*** alloc3 (int n1, int n2, int n3, int size)
{
int i3,i2;
void ***p;

if ((p=(void***)malloc(n3*sizeof(void**)))==NULL)
return NULL;
if ((p[0]=(void**)malloc(n3*n2*sizeof(void*)))==NULL) {
free(p);
return NULL;
}
if ((p[0][0]=(void*)malloc(n3*n2*n1*size))==NULL) {
free(p[0]);
free(p);
return NULL;
}

for (i3=0; i3<n3; i3++) {
p[i3] = p[0]+n2*i3;
for (i2=0; i2<n2; i2++)
p[i3][i2] = (char*)p[0][0]+size*n1*(i2+n2*i3);
}
return p;
}

我测试了这些代码。

double*** B= (double*** )alloc3(n_row,n_col,n_s,sizeof(double));
for(int i=0;i<n_s;i++)
{
for(int j=0;j<n_row;j++)
{
for(int k=0;k<n_col;k++)
{
printf("(%d,%d,%d)\t",i,j,k);
B[i][j][k] = 1.0;
}printf("\n");
}printf("----------\n");
}

有一个调试提示/错误:

enter image description here

但是如果我剪掉B[i][j][k] = 1.0;行,一切都会好的。我不明白这东西有什么问题。任何帮助将不胜感激。

最佳答案

你没有说哪一个失败了,但这并不重要,因为两者都不正确。

在 C 中,您无法将类型 void** 或​​类型 void*** 转换为类型 double** 或类型 double*** 而不导致未定义的行为。您的示例中的两个函数都执行此操作。

这会非常不方便,而且可能不太可能正确编写一个像您想象的那样分配内存的通用函数。

有一个更好的方法,使用指向可变长度数组的指针:

double (*d)[y][x] = malloc( z * y * x * sizeof( double ) );
d[z-1][y-1][x-1] = 123.45;

您只需免费调用一次:

free( d );

关于c - 当分配动态分配的 3D 数组时,程序会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40066324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com