簡體   English   中英

C-動態內存分配-復制字符串

[英]C - Dynamic Memory allocation - copy string

對於以下程序

#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部分,因為如果im將size設置為int high,則一切正常。

有人給我一個提示,我如何正確地重新分配呢?

感謝您的支持

realloc返回不同的指針時,您不需要復制數據-為您完成。 實際上,這是一個錯誤,因為您正在從不再存在的源中復制數據,並且復制的數據量是原來的兩倍! 所以你只需要

data = data_new;

另外這條線是錯誤的

data[len] = '0';

它應該是

data[len] = '\0';

並且還可以寫超出內存范圍的內容。 您應該在寫入終止符之前再次檢查大小,或更簡單地說,在使用size-1時重新分配內存,因為您知道將需要該額外的字節。

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

還要注意,如果要輸入每個換行符分隔的字符,則getchar()也會讀取每個換行符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM