在外部函数中分配一个字符串数组

3

我正在尝试通过另一个函数来分配字符串数组。在主函数中,我可以做到这一点,但是当我尝试在另一个函数中进行操作时(添加了另一层指针),我卡住了。

以下是代码:

int main() {

    char** book;

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

}

现在我尝试为5个由3个字母组成的字符串分配内存并填充它们,但我卡住了(程序执行停止):
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值。


1
我认为你需要 (*book_pt)[1] =。请查看此链接 - Matthew Gunn
1个回答

3

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

例如:

*book_pt[1]

should be:

(*book_pt)[1]

没有括号的[]运算符比*运算符具有更高的优先级,但您需要先取消引用book_pt

您的*book_pt [0]偶然起作用,但这只是因为book_pt [0]*book_pt相同。但是当索引 i 不为0时,*book_pt [i](* book_pt)[i]不同。


1
对于0索引,它是等价的。问题在于 *book_pt[1] - Matthew Gunn
谢谢,看起来我在提问之前并没有花太多时间尝试,但实际上我确实尝试了,再次感谢。 - Nicola
@MatthewGunn 随意改进答案。 - this
因此,我更喜欢使用1[*book_pt] - 这可以避免歧义。 - Norwæ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接