字符串数组的分配内存

时间:2015-12-18 19:17:45

标签: c arrays string pointers

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

3 个答案:

答案 0 :(得分:1)

您可以为此

使用动态内存分配
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
}

完成后不要忘记释放记忆。

答案 1 :(得分:0)

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

一种方法是让你声明一个合理的大型char数组来保存你的&#34;字符串&#34;。像这样:

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

输入实际&#34;字符串&#34;在char的图片中,你可以使用scanf,但我建议你使用fgets因为它更安全。

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

这种方法容易受到缓冲区溢出的影响,并不一定安全,但仍然是常见的方法

至于你的&#34;字符串数组&#34;问题,你想动态分配一切。 (如果你动态分配一个char **并使它指向堆栈分配的char []你要求很长时间的麻烦)

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

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

答案 2 :(得分:0)

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

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

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