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



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

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;
}

我应该对代码进行哪些更改,使其能够使用我的字符***?使用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*是dictionary[i][j]。–

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

下面是一个例子。

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的参数以适应您的问题/或在需要更多内存用于字符串时修改它们。此外,当您不需要

时,尝试释放内存可能是个好主意

别忘了这样malloc。。。

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

因为每个单词都以一个补充字节结尾,该字节填充有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 wordn");
    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;
}

相关内容

  • 没有找到相关文章

最新更新