为什么使用malloc segfault动态分配char **和char *类型?

时间:2015-04-10 00:30:48

标签: c dynamic segmentation-fault malloc allocation

我不明白为什么这段代码细分会出错。如果我在函数内部定义一个char **,分配给那个char **,然后在那个char **指向* commandsArray,它就可以工作。有人能解释一下我不理解的东西吗?提前致谢。

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

void input_str_to_sngl_commands( char*** commandsArray );

int main()
{

    char** commandsArray_var;
    input_str_to_sngl_commands( &commandsArray_var );

return 0;
}

void input_str_to_sngl_commands( char*** commandsArray )
{
    *commandsArray = (char**) malloc(2*sizeof(char**));
    *commandsArray[0] = (char*) malloc(30*sizeof(char));
    *commandsArray[1] = (char*)malloc(30*sizeof(char));
}

3 个答案:

答案 0 :(得分:0)

您的优先级错误:[]的优先级高于*,因此*commandsArray[1]访问的地址错误。

使用括号强制执行评估顺序,例如

*commandsArray = malloc(2*sizeof(char*));
(*commandsArray)[0] = malloc(30*sizeof(char));
(*commandsArray)[1] = malloc(30*sizeof(char));

或使用临时变量来使用更易读的语法:

char** ret = malloc(2*sizeof(char*));
ret[0] = malloc(30*sizeof(char));
ret[1] = malloc(30*sizeof(char));
*commandsArray = ret;

Demo.

注意: Casting malloc is unnecessary

答案 1 :(得分:0)

*commandsArray[1]*(commandsArray[1])相同,但您想要的是(*commandsArray)[1]

commandsArray[1]commandsArray_var之后的内存(就您而言包含垃圾),被视为char*

*commandsArray[1]尝试取消引用垃圾char*,即段错误。

您需要做的就是添加括号 - 将其设为(*commandsArray)[1]

这也会影响使用*commandsArray[0]的上一行,但巧合的是(自*x == x[0]起),(*commandsArray)[0]*(commandsArray[0])相同(两者都是相同的**commandsArray)。无论如何,您还应该将括号添加到该行,以明确您的代码尝试执行的操作。

答案 2 :(得分:0)

*commandsArray[0]应为(*commandsArray)[0]

此外,你malloc错误的空间量。通过使用与您正在创建的指针as explained here指向的类型相对应的sizeof表达式,可以减少出现此错误的可能性。

使用dasblinkenlight建议的临时指针也是一个好主意。这样可以更轻松地清除分配失败并更容易阅读代码:

char **new;

new = malloc( 2 * sizeof *new );
new[0] = malloc( 30 * sizeof **new );
new[1] = malloc( 30 * sizeof **new );

*commandsArray = new;