【问题标题】:Double pointer array allocation C [duplicate]双指针数组分配C [重复]
【发布时间】:2021-03-24 08:47:25
【问题描述】:

例如,我想为最多 30 个字符的 6 个单词分配一个数组。

我的老师说我应该分配6 "+1" 来计算我必须设置的NULL 我自己 在插入我的话之后。

char **array 究竟是如何分配的,为什么我的老师坚持?

【问题讨论】:

  • 你做过研究吗?有很多帖子提出了相同/相似的分配问题。
  • 我的老师说我应该分配 6 个“+1”来计算 NULL。你应该问老师这个问题。猜测是这样,您可以迭代数组并知道它在哪里结束,而无需事先知道数组的大小。
  • @kaylum 我的老师字面意思是“因为我这么说,如果你不按我说的做,我不会接受答案”哪个更好,我是否理解并不重要很明显
  • 在这种情况下,完整的任务要求可能会告诉我们为什么需要这样做。但是你没有提供,所以我们不能肯定地说。但正如我所说,它可能是数组结束标记。
  • @kaylum 关于链接的帖子,不,它没有帮助,因为我已经知道字符串应该以 '\0' 结尾,但我的问题是关于第一个维度。我需要存储 n 个单词的单元格数,以及是否应该再添加 1 个以终止我的第一个 NULL 暗淡,或者它是否已经存在

标签: arrays c malloc


【解决方案1】:

听起来你的老师希望你在数组末尾使用一个空指针,作为 sentinel 值。这类似于单个字符串的空终止,有时在字符串数量未知时很有用。

当您分配单个字符串时,您执行char* str = malloc(length + 1);,其中+1 表示空终止符'\0。额外的 +1 确保给定length = strlen("hello");,我们可以安全地使用strcpy(str, "hello") 来填充这个字符串。

您可以通过
char** arr = malloc(sizeof(char*[size+1]));
对字符串数组执行类似的操作 如果您随后将arr[size] = NULL; 分配为标记值,​​则可以以这种方式迭代此数组:

for(const char** ptr=arr; ptr!=NULL; ptr++)
{
  printf("%s\n", *ptr); // do something with each string
}

但如果你知道大小,那么首选方法是正常循环:

for(size_t i=0; i<size; i++)
{
  printf("%s\n", arr[i]); // do something with each string
}

【讨论】:

  • 您的malloc 应该在方括号内包含+1,否则您只为指针分配1 个字节。
  • @interjay Yikes,当然,谢谢。我也犯了很多其他愚蠢的错误。自我注意是不要在 SO 上发帖时从头顶编写代码,但总是在编译器上尝试它,即使它看起来微不足道:)
【解决方案2】:

char **arr = calloc(7, sizeof(char*)); 所以让我们分解一下,calloc 基本上是一个数组,第一个参数是数组的大小,第二个参数是为数组的每个索引分配多少内存。

【讨论】:

  • 这分配了一个7*6字符的数组,与char**不兼容。
  • 为什么不兼容?
  • 因为char** 应该指向char* 的数组。
  • 应该是char **arr = calloc(7, sizeof(char*));
猜你喜欢
  • 1970-01-01
  • 2021-04-03
  • 2016-10-09
  • 2012-11-17
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
相关资源
最近更新 更多