【问题标题】:Mixed dynamic and static allocation [duplicate]混合动态和静态分配[重复]
【发布时间】:2014-12-05 10:11:12
【问题描述】:

我有一个这样的 3D 数组 char **arr[1];

我是这样动态分配的:

*arr = calloc(10, sizeof(char*)); // Will be using 0-9
for(i = 0; i < 10; i ++)
    *arr[i] = malloc(3); // will be using 0-2

它崩溃了。即使,我无法为您提供我在其中读/写该数组的整个库,但问题的答案分配正确,将帮助我调试并抛出分配错误或不可能的可能性。

【问题讨论】:

  • arr 在我看来就像一个完美的 一维 数组。如果你想要 9x3 个字符,也许你想要char arr[9][3]?
  • 一维数组的二维指针数组?除此之外......我不能像预期的那样威胁它。不,我实际上想要为每个元素添加一个 char 项。
  • 不,只是一个一维数组(指针)。数组与指针不同。
  • 好吧,这就是问题所在,我该如何正确地做到这一点。因为我对char ***arr 进行了正确分配,但导致了奇怪的泄漏。
  • 只需再添加一个 [] 即可。 2D 数组的规则也递归地应用于 3D、4D、5D 等。这里的主要问题是您混淆了多维数组的基于指针到指针的查找表,这似乎是一个常见的误解。

标签: c arrays pointers dynamic


【解决方案1】:

我会这样做:

char** arr;
arr = malloc(10 * sizeof *arr);
if (!arr)
  return -1;
for (int i = 0; i < 10; i++)
{
  arr[i] = malloc(3);
  if (!arr[i])
    return -1;
}

如果你真的需要这个3d数组,正确的方法应该是:

char** arr[1];
arr[0] = malloc(10 * sizeof **arr);
if (!arr[0])
  return -1;
for (int i = 0; i < 10; i++)
{
  arr[0][i] = malloc(3);
  if (!arr[0][i])
    return -1;
}

完成后,您应该像这样释放内存(这适用于第二个示例):

for (int i = 0; i < 10; i++)
  free(arr[0][i]);
free(arr[0]);

其他方法有:char arr[3][10]; 或 char arr[1][3][10];,但只有 1 个值的数组没有多大意义。

【讨论】:

  • 它使。而且我做得对。我发现了为什么它会发生奇怪的泄漏。我无法从数组中取出char* 到puts()
  • 所以如果*arr[1] 将是char* 而不是char..
  • 你需要(*arr)[1],它等于arr[0][1],而不是*arr[1],它等于arr[1][0],这是越界的。
  • 但我不需要 char* arr[0][1] 因此它只有 1 个字节。我需要.. ehh.. arr[1] as char*
猜你喜欢
  • 1970-01-01
  • 2018-10-01
  • 2011-12-21
  • 1970-01-01
  • 2015-02-27
  • 2013-07-10
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多