另一个函数中的 Malloc 和赋值

Malloc and Assignment inside another function

我需要帮助来理解为什么这不起作用。

我正在尝试 malloc 并通过另一个函数分配指令和分隔符。在我尝试过的所有方法中,我在第二个作业 *separators[1] = '1' 上遇到 分段错误 ,但由于某种原因,*separators = '2' 有效。

我认为引用指针有些地方我不明白。


这是我的简化代码

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

void        split_instructions(char ***instructions, char **separators)
{
    int split_len = 2;

    *instructions = (char **)malloc(sizeof(char*) * split_len + 1);
    if (*instructions == NULL)
        return;
    *separators = (char *)malloc(sizeof(char) * split_len + 1);
    if (*separators == NULL)
    {
        free(instructions);
        return;
    }
    *separators[0] = (char)'q';
    *separators[1] = (char)'1';
    //*separators = "22"; <- this work
    *instructions[0] = (char*)"test";
    *instructions[1] = (char*)"test2";
}

int main(void)
{
   char **instructions;
   char *separators;
   
   split_instructions(&instructions, &separators);
}

类似

的表达
*separators[1] = (char)'1';
由于 operator precedence.

无法正常工作

[] 运算符的优先级高于 * 运算符,因此它会尝试写入 separators 的第二个元素,而“数组”只有一个元素指出的。

应该这样写

(*separators)[1] = (char)'1';

另请注意

中的分配大小
*instructions = (char **)malloc(sizeof(char*) * split_len + 1);

看起来很奇怪。 + 1 只会增加一个字节的分配大小,而不是一个元素的大小。如果你应该为另一个元素分配,它应该是

*instructions = malloc(sizeof(char*) * (split_len + 1));

*instructions = malloc(sizeof(**instructions) * (split_len + 1));

请注意 malloc() 家族的铸造结果是 considered as a bad practice