【问题标题】:Allocating an array of strings in external function在外部函数中分配字符串数组
【发布时间】:2015-11-26 17:42:59
【问题描述】:

我正在尝试通过另一个函数分配一个字符串数组。我可以在 main 中做到这一点,但是当我在另一个函数中尝试它时(添加另一个级别的指向)我卡住了。

这是代码:

int main() {

    char** book;

    FillBook( &book );
    ...
    ...

}

现在我尝试为 3 个字母的 5 个字符串分配内存并填充它们,但我卡住了(程序执行停止):

void FillBook( char*** book_pt ) {

    *book_pt = malloc( 5 * sizeof( char* ) ); //this is where I make space for 5 strings

    *book_pt[0] = malloc( 5 * sizeof( char ) ); //this one works
    strcpy(*book_pt[0], "ok"); 

    *book_pt[1] = malloc( 5 * sizeof( char ) ); //this one doesn't and the execution stops here
    strcpy(*book_pt[1], "no"); 

    return;
}

我在 *book_pt[0] 之后尝试分配的每个指针都会产生相同的效果。 它也使用 strdup 做同样的事情。

添加行:

(*book_pt == NULL)

第一个 malloc 后显示它没有返回 NULL 值。

【问题讨论】:

  • 我认为你需要(*book_pt)[1] = 。检查this link

标签: c arrays string pointers malloc


【解决方案1】:

使用变量char*** book_pt 的表达式缺少改变优先级的括号。

例如:

*book_pt[1]

应该是:

(*book_pt)[1]

不带括号的 [] 运算符优先于 * 运算符,但需要先取消引用 book_pt

您的*book_pt[0] 恰好可以工作,但这只是因为book_pt[0]*book_pt 相同。但是,当索引 i 不是 0 时,*book_pt[i](*book_pt)[i]不同

【讨论】:

  • 好吧,对于 0 索引它是等价的。问题是*book_pt[1]
  • 谢谢,看来我确实没花太多时间去尝试,但我确实做到了,再次感谢您
  • @MatthewGunn 随时改进答案。
  • 出于这个原因,我更喜欢1[*book_pt] - 它巧妙地避免了歧义
猜你喜欢
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多