1

我找到的答案似乎都没有解决我的问题。我正在 C 中创建一个动态 3d 数组,然后将其释放。我可以使用嵌套的 for 循环存储并稍后访问存储在此数组中的数据,但是在尝试使用相同的嵌套 for 循环设置释放它时出现访问冲突。我哪里错了?

unsigned char ***buff1;
int r, c;
someFunction(&buff1, &r, &c);
for(int i = 0; i < r; ++i)
{
  for(int j = 0; j < c; ++j)
  {
    free(buff1[i][j]);
  }
  free(buff1[i]);
}
free(buff1);


someFunction(unsigned char**** buff, int *nR, int *nC)
{
  ...
  *buff = (SQLCHAR***)malloc(*nR * sizeof(SQLCHAR**));
  for(int i = 0; i < *nR; ++i)
  {
    (*buff)[i] = (SQLCHAR**)malloc(*nC * sizeof(SQLCHAR**));
    for(int j = 0; j < *nC; ++j)
    {
      (*buff)[i][j] = (SQLCHAR*)malloc(256);
    }
  }
}
4

3 回答 3

2

有很多事情是错误的:

unsigned char**** buff

如果没有错,这是什么?(好吧,好吧,不是技术上,而是风格上……)

(SQLCHAR*)malloc(256);

也不是更好,因为您不能强制转换malloc()in C的返回值。

第三个错误是您没有 3D 数组。你有一个指针到指针的指针。万维网。丑陋的。为什么不分配一个真正的 3D 数组呢?

size_t xsize, ysize, zsize; // initialize these!
unsigned char (*arr)[ysize][zsize] = malloc(sizeof(*arr) * xsize);

那么你需要做的就是释放它:

free(arr);

老实说,这样不是更好吗?

于 2013-07-23T20:13:12.137 回答
2

我尝试用这种方式编写代码,效果很好:

#include "stdio.h"
#include "stdlib.h"

int  someFunction (unsigned char**** buff, int *nR, int *nC)
{
  int i,j;
  *buff = (unsigned char ***)malloc(*nR * sizeof(char**));
  for(i = 0; i < *nR; ++i)
  {
    (*buff)[i] = (unsigned char**)malloc(*nC * sizeof(char**));
    for(j = 0; j < *nC; ++j)
    {
      (*buff)[i][j] = (unsigned char*)malloc(256);

      (*buff)[i][j][0] ='1';
    }
  }
}


int main()
{
unsigned char ***buff1;
int r = 3, c= 2,i,j;
someFunction(&buff1, &r, &c);
for( i = 0; i < r; ++i)
{
  for(j = 0; j < c; ++j)
  {
        printf("        %c",buff1[i][j][0]);
    free(buff1[i][j]);
  }
  free(buff1[i]);
}
free(buff1);
}

因此,您向我们展示的代码中可能没有发生错误。

于 2013-07-23T23:14:01.933 回答
1

您的代码看起来很麻烦。对于初学者,someFunction(&buff1, &r, &c)当该函数需要ints 而不是int *s 时,您正在调用。稍后您取消引用 nR 和 nC ,它们不是指针。

我猜你应该在编译时收到一些讨厌的警告。

于 2013-07-23T20:14:53.177 回答