如何动态分配二维指针数组? (C)

时间:2013-12-15 19:34:50

标签: c arrays string pointers malloc

我有一个编写字典的任务。 它将包含x个单词及其定义(由用户输入)。 说明说字典应该是char ***类型(2D数组指针=数组=字符串),但我完全不知道如何动态分配数组的大小。它应该有2行,1个用于单词,另外1个用于它们的定义,列数由字典中的单词数决定。在网上寻求帮助时,我提出了这个问题:

char** AllocateArray(int line, int column)
{
    char** pArray=(char**)malloc(line*sizeof(char*));
    int i;
    for(i=0;i<2;i++) 
        pArray[i]=(char*)malloc(column*sizeof(char));

    return pArray;
}

我应该在代码中对我的char ***进行哪些更改? 使用Visual Studio 2012

编辑:

我现在遇到问题:

void inputString(char* p1)
{
    char buffer[80];
    printf("\nEnter a word:");
    scanf("%s",buffer);
    p1=(char*)malloc(strlen(buffer)+1);
    if(p1!=NULL)
    {
        strcpy(p1,buffer);
        free(buffer);
    }
}
输入一个单词后它立即崩溃了。函数接收的char *是字典[i] [j]。 -

4 个答案:

答案 0 :(得分:2)

不要在堆栈上分配free()任何内容(即buffer)。 此外,您的函数inputString()不会告诉其客户端它分配了哪些内存,因为p1是本地的。

答案 1 :(得分:0)

这是一个例子。

char*** dictionary;
int i = 0;
int j = 0;
int lines = 10;
dictionary = (char***)malloc(sizeof(char**)*lines);

for(i=0;i<lines;i++)
{
    dictionary[i] = (char**)malloc(sizeof(char*)*4);
    for(j=0;j<4;j++)
        dictionary[i][j] = (char*)malloc(sizeof(char)*25);
}

您需要修改malloc的参数以适应您的问题/或在您需要更多字符串内存时修改它们。 另外,当你不需要它时尝试释放内存可能是一个好主意

答案 2 :(得分:0)

不要忘记像这样的malloc ......

dictionary[i][j] = (char*)malloc(sizeof(char)*strlen(word_to_insert)+1);

...因为每个单词都以一个填充0“null终止字符串”的补充字节结束。

答案 3 :(得分:0)

样本

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

int main(){
    char ***dictionary;
    const char *words[] = { "ASEAN", "United Nations", "OPEC" };
    size_t howManyWords = sizeof(words)/sizeof(*words);
    int i;

    dictionary = malloc(howManyWords*sizeof(char**));
    printf("Please enter the definition of this word\n");
    for(i = 0; i < howManyWords; ++i){
        char buff[80];
        char **keyValue;

        printf("%s : ", words[i]);
        fgets(buff, sizeof(buff), stdin);
        keyValue = malloc(2*sizeof(char*));
        keyValue[0] = (char*)words[i];
        keyValue[1] = malloc(strlen(buff)+1);
        strcpy(keyValue[1], buff);
        dictionary[i] = keyValue;
    }

    //print
    for(i=0;i<howManyWords;++i){
        printf("%s : %s", dictionary[i][0], dictionary[i][1]);
    }
    //release
    for(i=0;i<howManyWords;++i){
        free(dictionary[i][1]);
        free(dictionary[i]);
    }
    free(dictionary);
    return 0;
}