【问题标题】:Dynamic memory allocation for pointer arrays指针数组的动态内存分配
【发布时间】:2013-10-04 19:21:27
【问题描述】:

我正在尝试编写一个程序,它从文本文件中读取一系列字符串并将这些字符串存储在字符串数组中,为每个元素动态分配内存。我的计划是使用指针将每个字符串存储在一个数组中,然后随着读取的更多内容增加数组大小。我无法理解为什么下面的测试代码不起作用。这是一个可行的想法吗?

char *aPtr;
aPtr =(char*)malloc(sizeof(char));

aPtr[0]="This is a test";


printf("%s",aPtr[0]);

【问题讨论】:

标签: c arrays dynamic-memory-allocation pointer-to-pointer


【解决方案1】:

在 C 中,字符串是 char*T 类型的动态数组表示为指向 T 的指针,因此对于 char*,它将是 char**,而不仅仅是您声明它的方式 char*

毫无疑问,编译器已经发出了一些警告。请注意这些警告,它们通常可以帮助您了解该怎么做。

您可以通过以下方式开始测试:

char **aPtr;
int len = 1; // Start with 1 string
aPtr = malloc(sizeof(char*) * len); // Do not cast malloc in C
aPtr[0] = "This is a test";
printf("%s",aPtr[0]); // This should work now.

【讨论】:

  • 验证(请耐心等待,我是新手 =]),如果您想要一个指向 char 的动态指针数组(例如,在您可能需要存储可变数字字符串,例如,在不知道其长度的情况下读取文本文件或收集未指定长度的用户输入),那么您需要一个 Char* 的动态数组,因此您需要一个 Char**。 char**可能指向不同的字符指针,可能是不同字符串的起始地址。
  • 这里的len=1 是干什么用的?看起来This is a test 将是 14 个字符,每个字符都是一个字节......但是这段代码没有提到 14,也没有在我运行时出现段错误。
  • @nmz787 注意aPtr的类型,它是一个双指针,所以表示一个字符指针数组。然后将 char 指针设置为元素零;此代码中没有发生字符串复制。
【解决方案2】:
char *str; //single pointer   

这样你可以存储一个字符串。


要存储array of strings你需要two dimensional character array

或者array of character pointers或者double pointer


char str[10][50]; //two dimensional character array

如果你这样声明,你不需要分配内存,因为这是静态声明


char *str[10];  //array of pointers 

这里需要为每个指针分配内存

遍历数组为每个指针分配内存

for(i=0;i<10;i++) 
str[i]=malloc(SIZE);

char **str;    //double pointer

这里你需要为 Number of pointers 分配内存,然后为每个指针分配内存。

str=malloc( sizeof(char *)*10);

然后循环遍历数组为每个指针分配内存

for(i=0;i<10;i++) 
str[i]=malloc(SIZE);

【讨论】:

    【解决方案3】:
    char * aPtr;
    

    作为指向字符的指针,您为其分配了内存以准确保存1 字符。

    在做

    aPrt[0] = "test";
    

    你为这个 one 个字符寻址内存并尝试将文字 "test" 的地址存储到它。这将失败,因为这个地址最可能比字符宽。

    您的代码的修复方法是为指向字符的指针分配内存。

    char ** aPtr = malloc(sizeof(char *));
    aPtr[0] = "test";
    printf("%s", aPtr[0]);
    

    更优雅和更健壮的方法是通过以下方式分配相同的(以及添加强制错误检查):

    char ** aPtr = malloc(sizeof *aPtr);
    if (NULL == aPtr)
    {
      perror("malloc() failed");
      exit(EXIT_FAILURE);
    }
    
    ...
    

    【讨论】:

      【解决方案4】:

      你完全错了。你的代码的正确版本应该是这样的:

      int main ()
      {
      char *aPtr;
      aPtr =(char*)malloc(20*sizeof(char));
      aPtr ="This is a test";
      printf("%s",aPtr);
      }
      

      您可以使用指针数组。如果要存储多个字符串。是的,我知道使用 for 循环会很容易。但我试图用简单的方式解释,即使是初学者也能理解。

      int main ()
      {
      char *aPtr[10];
      aPtr[0] =(char*)malloc(20*sizeof(char));
      aPtr[0] ="This is a test";
      aPtr[1] =(char*)malloc(20*sizeof(char));
      aPtr[1] ="This is a test2";
      printf("%s\n%s\n",aPtr[0],aPtr[1]);
       }
      

      【讨论】:

      • 您的第一个示例泄漏了内存,即 20 个字节。执行aPtr ="This is a test"; 您会丢失对malloc() 返回的内容的引用。此内存从未使用过,并且在程序的直播期间永远不会使用。
      • sizeof(char)is 1 是定义。在 C 中不需要也不推荐将 malloc/calloc/realloc 的结果转换为:stackoverflow.com/a/605858/694576
      • 感谢所有回复的人,这是一个很大的帮助
      猜你喜欢
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2013-04-18
      • 2019-07-12
      • 2015-02-05
      • 2014-03-10
      相关资源
      最近更新 更多