在C中为指针到指针的指针分配内存

在C中为指针到指针的指针分配内存,c,pointers,memory,memory-management,C,Pointers,Memory,Memory Management,我正在尝试为三重指针分配内存,但我无法使其正确。我有指向char的指针 char **words; allocate(&words); 我创建了内存分配方法: void allocate(char ***words){ for (int i = 0; i < MAXWORDNUM; ++i) (*words)[i] = malloc(sizeof(char*) * MAXWORDNUM); for (int i = 0; i < MAXW

我正在尝试为三重指针分配内存,但我无法使其正确。我有指向char的指针

char **words;
allocate(&words);
我创建了内存分配方法:

void allocate(char ***words){

    for (int i = 0; i < MAXWORDNUM; ++i)
        (*words)[i] = malloc(sizeof(char*) * MAXWORDNUM);

    for (int i = 0; i < MAXWORD; ++i)
        (**words)[i] = malloc(sizeof(char) * MAXWORD);
}
如何让它工作? 谢谢

无效分配(字符***字){
void allocate(char ***words){
    *words = malloc(sizeof(char*) * MAXWORDNUM);
    for (int i = 0; i < MAXWORDNUM; ++i)
        (*words)[i] = malloc(MAXWORD);
}
*words=malloc(sizeof(char*)*MAXWORDNUM); 对于(int i=0;i
如果需要指针数组,而不是指针数组,则不需要第一个循环:

void allocate(char ***words){
    /* for (int i = 0; i < MAXWORDNUM; ++i) */ 
    /* (m)allocate space for n pointers to words */
    *words = malloc(sizeof(char *) * MAXWORDNUM);

    for (int i = 0; i < MAXWORDNUM; ++i)
        (*words)[i] = malloc(MAXWORD); /* (m)allocate space for each word */
}

int main(void)
{
    char **words;

    allocate(&words);
    return 0;
}
void分配(字符***字){
/*对于(int i=0;i
这取决于您的目的,您是要创建二维数组,还是指针数组,还是只创建指向指针的指针

1) 二维数组

void allocate_two_dimen_array(char ***words, unsigned int x, unsigned int y){
    *word = malloc(x * y * sizeof(char));
}
2) 字符指针数组

void allocate_pointer_array(char ***words, unsigned int quantity){
    *word = malloc(quantity * sizeof(char*));
} 
3) 指向char指针的纯指针

void allocate_pointer_pointer(char ***words){
    *word = malloc(sizeof(char**));
}
出于实际目的,例如:第一个用于存储bmp图像,第二个用于存储一组字符串

word = {"This is the first line", "This is the second line"}; 

(*字)[i]=…
已经是一个糟糕的举动<代码>*单词并不指向在该点上确定的任何东西,因此
(*单词)[i]
是UB。第二个循环只是间接错误引导。此代码在我的mac中运行良好:(@vaibhav:no,这段代码在你的Mac中调用未定义的行为。如果我理解你的意图,你试图分配一个
MAXWORDNUM x MAXWORDNUM
矩阵的
char*
,每个矩阵都被分配了空间来容纳
MAXWORD
字符。这样正确吗?如果不正确,你是在尝试分配一个简单的指针数组吗在
MAXWORDNUM
元素中,每个元素都是一个长度指向内存
MAXWORD
char*
元素?@WhozCraig不,我正试图将MAXWORDNUM x MAXWORD 2D指针数组分配给char…你能解释一下malloc(MAXWORD)的用法吗在这种情况下有效?据我所知,我们需要以比特为单位提供大小…为什么在第一个示例中我们使用sizeof(char*)*MAXWORDNUM,但这里仅使用MAXWORD?您可以执行
malloc(sizeof(char)*MAXWORD)
但使用sizeof(char)是1,所以我省略了它。如果您希望更具体一些,行为将是相同的。我仍然不明白为什么
*words=malloc(sizeof(char*)*MAXWORDNUM)
是正确的。
*words
是类型
char**
。指针的大小不受任何特殊原因的影响
malloc
中的核心大小是
sizeof(char*)
而不是
sizeof(char**)
(或者更好的是,
sizeof(*words)
)。Alter Mann的答案也有类似的差异。(顺便说一句,我读代码太晚是合理的回答)。@WhozCraig
*单词是char**
--所以
(*words)[i]
char*
,所以当然要分配一些
char*
s.@WhozCraig为了清晰、一致和类型安全,我总是将其编码为
foo=malloc(sizeof*foo*N)
,因此这将是
*words=malloc(sizeof**words*MAXWORDNUM)
word = {"This is the first line", "This is the second line"};