【问题标题】:Allocation memory for array of strings为字符串数组分配内存
【发布时间】:2016-03-25 13:40:04
【问题描述】:

如何分配初始内存,并在每个用户输入中为已知列数的字符串数组增加内存。 例如:` char* type[20]; 我想为它分配初始内存并增加每个 scanf("%s", type[i]); 的空间。这是在循环中。 你能帮帮我吗

【问题讨论】:

  • 提示:动态内存和realloc.
  • 我刚刚回答了a question very similar to this,很高兴(为您)为您的问题提供了完整的解决方案。

标签: c arrays string pointers


【解决方案1】:

数组是一块连续的内存,当你声明一个特定类型的数组时,你不能再增加或减少它的大小。

一种方法是让您声明一个合理的大型 char 数组来保存您的“字符串”。像这样:

const int size=256;
char input[size]; //declares an array of 256 chars

至于在 char 的数组中输入实际的“字符串”,您可以使用 scanf,但我建议您使用 fgets,因为它更安全。

while(fgets(input, size, stdin)!=NULL)
{
   //do something with input
}

这种方法容易发生缓冲区溢出,不一定安全,但仍然是常见的方法

至于您的“字符串数组”问题,您希望动态分配所有内容。 (如果您动态分配一个 char** 并使其指向堆栈分配的 char[],那么您会遇到很大的麻烦)

你应该为你的 char** 使用一个默认大小(比如接受 1000 个 char* )并为你的每个 char* 使用一个默认分配大小,例如 256 *sizeof(char) 字节。

这样,您可以在每次耗尽空间时使用 realloc。

【讨论】:

    【解决方案2】:

    每次必须读取新字符串时,您可以使用标头<stdlib.h> 中声明的标准函数realloc

    这里是一个演示程序,它不是读取字符串,而是复制固定数量的字符串

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    int main( void )
    {
    
        char ( *s )[20] = NULL;
        char ( *p )[20]  = NULL;
        size_t n = 0;
    
        do
        {
            p = realloc( s, ( n + 1 ) * sizeof( *s ) );
    
            if ( p )
            {
                s = p;
                strcpy( s[n], ( char[] ){ 'A' + n, '\0'} );
                ++n;
            }
        } while ( p && n < 10 );
    
        for ( size_t i = 0; i < n; i++  ) puts( s[i] );
    
    
        free( s );
    }
    

    程序输出是

    A
    B
    C
    D
    E
    F
    G
    H
    I
    J
    

    注意realloc这个函数是怎么使用的。

    如果您知道字符串的数量不能小于某个常数,那么您可以最初动态分配一个大小等于该常数的数组。

    例如

    #define MIN_SIZE 10
    
    //...
    
    char ( *s )[20] = malloc( MIN_SIZE * sizeof( *s ) );
    

    【讨论】:

    • 没错,我在手机上输入错误的地方。无论如何,原作者同时编辑了hi的答案。对此感到抱歉:))
    【解决方案3】:

    您可以为此使用动态内存分配

    char *read_string(void)
    {
          int c;
          int i = 0;
          char *s = malloc(1);
          printf("Enter a string: \t"); // It can be of any length
          /* Read characters until found an EOF or newline character. */
          while((c = getchar()) != '\n' && c != EOF)
          {
                s[i++] = c;
                s = realloc(s, i+1); // Add memory space for another character to be read.
          }
          s[i] = '\0';  // Nul terminate the string
          return s;
    }  
    
    int main(void)
    {
        char* type[20]; 
        for( size_t i = 0; i < sizeof(type); i++)
            type[i] = read_string(); 
        // Do some other stuff
    }
    

    完成后不要忘记释放内存。

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2014-01-05
      • 2017-03-28
      • 1970-01-01
      • 2022-11-28
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      相关资源
      最近更新 更多