【问题标题】:How to dynamically allocate a two dimensional array of pointers ? (C)如何动态分配一个二维指针数组? (C)
【发布时间】:2013-12-15 19:34:49
【问题描述】:

我有一个任务是制作一本字典。 它将包含 x 数量的单词及其定义(由用户输入)。 说明说字典应该是 char*** 类型(指针的二维数组=数组=字符串),但我完全不知道如何动态分配数组的大小。它应该有 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* 是 dictionary[i][j]。 ——

【问题讨论】:

  • 成为“三星级程序员”通常不是一件好事。

标签: c arrays string pointers malloc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是一个例子。

    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 的参数以适应您的问题/或在您的字符串需要更多内存时修改它们。 此外,在不需要时尝试释放内存可能是个好主意

    【讨论】:

    • 我同意在 C(而不是 C++)中没有必要,但至少在他是动态内存分配的初学者时编写强制转换是一个很好的做法,因为这有助于他更好地理解指针(这是他的主要问题)。
    【解决方案3】:

    别忘了这样 malloc...

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

    ...因为每个单词都以一个补充字节结尾,其中填充了 0“空终止字符串”。

    【讨论】:

      【解决方案4】:

      一个样本

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

      【讨论】:

        猜你喜欢
        • 2010-12-18
        • 2017-09-28
        • 1970-01-01
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多