簡體   English   中英

另一個函數內部的 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()系列的轉換結果被認為是一種不好的做法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM