C - 动态内存分配 - 复制字符串

问题描述 投票:0回答:1

对于以下程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  int size = 16, len = 0, c;
  char* data = (char*)malloc(sizeof(char) * size);
  while((c = getchar()) != EOF) {
    if(len == size) {
      size *= 2;
      char* data_new = (char*)realloc(data, sizeof(char) * size);
      if(data_new == NULL) {
        free(data);
        return -1;
      }
      if(data_new != data) {
        memcpy(data_new, data, size);
        data = data_new;
      }
    }
    data[len] = c;
    len++;
  }
  data[len] = '0';
  printf("%s\n", data);
  free(data);
  return 0;
}

我认为错误在于realloc部分,因为如果我将int设置为高,一切正常。

有人给我一个提示,我怎么能正确地做这个realloc事情?

谢谢您的支持

c dynamic-memory-allocation memcpy realloc
1个回答
1
投票

realloc返回不同的指针时,您不需要复制数据 - 这是为您完成的。事实上,这是一个错误,因为您从不再存在的数据源复制数据,并且数量是它的两倍!所以你只需要

data = data_new;

这条线也错了

data[len] = '0';

它应该是

data[len] = '\0';

并且还可以写出超出内存界限。您应该在编写终结符之前再次检查大小,或者更简单地说,在使用size-1时重新分配内存,因为您知道您将需要额外的字节。

if(len == size - 1) {
    // . . . 
}

另请注意,如果您输入的每个字符都以换行符分隔,那么getchar()也将读取每个换行符。

© www.soinside.com 2019 - 2024. All rights reserved.