动态内存分配字符串

时间:2015-03-22 07:49:41

标签: c dynamic-memory-allocation

如何为字符串动态分配内存?

我想将文本文件作为输入,并希望将文件的字符存储为字符串。

首先,我计算文本文件中的字符数,然后为此大小动态分配字符串,然后将文本复制到字符串。

main()
{


    int count = 0;  /* number of characters seen */
    FILE *in_file;    /* input file */

   /* character or EOF flag from input */
    int ch;

    in_file = fopen("TMCP.txt", "r");
    if (in_file == NULL) {
        printf("Cannot open %s\n", "FILE_NAME");
        exit(8);
    }

    while (1) 
    {
        ch = fgetc(in_file);
        if (ch == EOF)
            break;
        ++count;
    }
    printf("Number of characters is %d\n",
                  count);


    char *buffer=(char*)malloc(count*(sizeof(char)));
}

2 个答案:

答案 0 :(得分:2)

这是一个糟糕的解决方案。您可以使用大量方法确定文件的大小(搜索tell文件大小,特别是fstat),并且您可以直接mmap将文件存入内存,你正是那个缓冲区。

答案 1 :(得分:0)

一种选择是一次读取一个固定大小的块文件,并在读取文件时扩展动态缓冲区。如下所示:

#define CHUNK_SIZE 512
...
char chunk[CHUNK_SIZE];
char *buffer = NULL;
size_t bufSize = 0;
...
while ( fgets( chunk, sizeof chunk, in_file ) )
{
  char *tmp = realloc( buffer, bufSize + sizeof chunk );
  if ( tmp )
  {
    buffer = tmp;
    buffer[bufSize] = 0; // need to make sure that there is a 0 terminator
                         // in the buffer for strcat to work properly.
    strcat( buffer, chunk );
    bufSize += sizeof chunk;
  }
  else
  {
    // could not extend the dynamic buffer; handle as necessary
  }
}

此代码段一次最多可从in_file读取511个字符(fgets将零终止目标数组)。它将为每个块分配和扩展buffer,然后将输入连接到buffer。为了使strcat正常工作,目标缓冲区需要以0结尾。第一次在最初分配缓冲区时不能保证这一点,尽管它应该在后续迭代中进行。

另一种策略是每次将缓冲区大小加倍,这样可以减少realloc次调用,但这可能更容易理解。