【问题标题】:C - Dynamic Memory allocation - copy stringC - 动态内存分配 - 复制字符串
【发布时间】:2019-03-05 18:37:07
【问题描述】:

用于以下程序

#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 操作?

感谢您的支持

【问题讨论】:

  • 错误是什么?
  • 不需要memcpy 部分,因为realloc 正在为您复制数据。 datarealloc 之后变为(可能变为)无效。
  • data[len] = '0'; 这不是 NUL 终止符。
  • 如果您的数据长度为 16 或 32 或 64 个字符,data[len] 将是主循环后有效内存后的一个字符。
  • 如果您的输入正好是 16(或 32,或 64,...)字节,您将尝试在分配区域之外写入。

标签: c dynamic-memory-allocation memcpy realloc


【解决方案1】:

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

data = data_new;

这行也是错的

data[len] = '0';

应该是

data[len] = '\0';

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

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

还要注意,如果您输入的每个字符都由换行符分隔,那么getchar() 也会读取每个换行符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2018-03-18
    相关资源
    最近更新 更多