gpt4 book ai didi

在 C 中创建 *** 对象(指向指针的指针)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:44 24 4
gpt4 key购买 nike

我正在尝试编写一个函数来创建一个连续的内存块并将其分配给一个 3d 数组。该代码的工作原理是它允许我使用内存,并且当我使用存储在使用此函数创建的对象中的数据时,结果看起来是正确的。但是,当我尝试释放使用此函数分配的内存时,我立即收到 glibc 错误。这是函数:

void *** matrix3d(int size, int rows, int cols, int depth) {
void ***result;

int col_size = depth * size;
int row_size = (sizeof(void *) + col_size) * cols;
int data_size = (rows * cols * depth + 1) * size;
int pointer_size = rows * sizeof(void **) + cols * sizeof(void *);
int i, j;
char *pdata, *pdata2;

if((result = (void ***) malloc(pointer_size + data_size)) == NULL)
nerror("ERROR: Memory error.\nNot enough memory available.\n", 1);

pdata = (char *) result + rows * sizeof(void **);

if((long) pdata % (col_size + sizeof(void *)))
pdata += col_size + sizeof(void *) - (long) pdata % (col_size + sizeof(void *));

for(i = 0; i < rows; i++) {
result[i] = pdata;

pdata2 = pdata + cols * sizeof(void *);

for(j = 0; j < cols; j++) {
result[i][j] = pdata2;
pdata2 += col_size;
}

pdata += row_size;
}

return result;
}

它是这样调用的:

double ***positions = (double ***) matrix3d(sizeof(double), numResidues, numChains, numTimesteps);

for(i = 0; i < numResidues; i++)
for(j = 0; j < numChains; j++)
for(k = 0; k < numTimesteps; k++)
positions[i][j][k] = 3.2;

free(positions);

我做错了什么?感谢您的帮助。

最佳答案

What have I done wrong?

您的代码很难理解(您经常使用 pdata),但 99% 的代码都超出了分配的空间,并且弄乱了 glibc 留下的簿记。

I can use the data I've written just fine. The only issue is when I try to use free.

那是因为 glibc 只有在您调用它时才有机会看到您搞砸了。

关于在 C 中创建 *** 对象(指向指针的指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11964985/

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