C - 为stdin动态分配数组而不重新分配

时间:2014-09-15 15:17:15

标签: c malloc dynamic-arrays

我有一个项目,我正在研究,这将是从终端上运行的另一个程序输出的输入,如下所示:

./other_program | ./project

所以我从other_program获取输出并在项目中使用

read(0, buffer, BUFF_SIZE);

但如果想象那不是最好的方法。我知道我可以遍历stdin并只使用realloc来增加缓冲区大小,但由于项目规范,我禁止使用realloc,这表示我只能使用malloc,读取,写入,打开和释放。

还有其他出路吗? 谢谢!

3 个答案:

答案 0 :(得分:1)

如果您可以使用有界长度的块处理输入,则更喜欢重用该长度的缓冲区,并在每次迭代时使用memset清除它。如果你必须一次在内存中输入整个输入(或任意大部分),那么你将不得不模仿realloc作为@dolan提及。这可以这样做:

#define BUFFER_INCREMENT 128

// In some function somewhere...

    size_t bufsize = BUFFER_INCREMENT;
    char *buffer = malloc(bufsize * sizeof(char));
    char *bufferp = buffer;
    while( fgets(bufferp, BUFFER_INCREMENT, stdin) ){
        size_t newSize = strlen(bufferp);
        char *newbuffer = malloc( (bufsize + newSize) * sizeof(char) );
        memcpy( newbuffer, buffer, bufsize );
        free( buffer );
        buffer = newbuffer;
        bufferp += newSize;
        bufsize += newSize;
    }

答案 1 :(得分:1)

反复将数据读入本地缓冲区并将其附加到大缓冲区。

读取后,分配给bigbuf的内存大小与读取的数据大小相同。

更强大的解决方案将使用指数增长(可能是1.5倍至3倍)bigbufsize

#define BUFF_SIZE 1024
char buffer[BUFF_SIZE];
char *bigbuf = NULL;
size_t bigbufsize = 0;

ssize_t len;
while( (len = read(0, buffer, sizeof buffer)) > 0) {
  size_t newbigbufsize = bigbufsize + len;
  char *newbigbuf = malloc(newbigbufsize);
  if (newbigbuf == NULL) exit(1);  //Handle OOM

  memcpy(newbigbuf, bigbuf, bigbufsize);
  memcpy(&newbigbuf[bigbufsize], buffer, len);
  free(bigbuf);
  bigbuf = newbigbuf;
  bigbufsize = newbigbufsize;
}

// Use data
foo(bigbuf, bigbufsize);

// clean-up
free(bigbuf);
bigbuf = NULL;
bigbufsize = 0;

答案 2 :(得分:-1)

使用ft_concat;) 在stackoverflow之前向你的邻居询问!

就个人而言,我已经构建了一个链式列表,然后将其转换为char数组