簡體   English   中英

如何在 C++ 類中初始化 char *? (sizeof() 總是給出 8)

[英]How to initialize char * in c++ class? (sizeof() always gives 8)

我在學校的代碼方面遇到了一些麻煩。 問題是我有一個名為“contenido”的字符指針,如下所示:

class Archivo {
 public:
  Archivo(const char *filename, int banderas);
  Archivo(const char *filename, int banderas, mode_t modo);
  ~Archivo();
  size_t lee(size_t nbytes);
  size_t escribe(const void *buffer, size_t nbytes);
  char *get_contenido();
  void cerrar();

 protected:
  string nombreArchivo;
  int fd;

  //Problematic char pointer
  char *contenido;
};

該代碼應該是 c 函數read()write()open()的類實現,我需要為我的字符指針設置新大小的具體方法是size_t lee(size_t nbytes); 我是這樣實現的:

size_t Archivo::lee(size_t nbytes) {
  contenido = new char[nbytes];
  cout << "contenido: " << sizeof(contenido) << endl;
  nbytes = read(fd, contenido, sizeof(contenido));
  return nbytes;
}

在這種方法中,我應該收到一個新的“contenido”大小,在這種情況下,它可以作為 read() 函數的緩沖區,但不幸的是,我使用哪個值並不重要,它總是在調用sizeof(contenido) 我已經嘗試使用malloc()的構造,使用malloc()然后realloc()並為您可能會看到使用new char[size_t]但在每一個情況下,我收到的“8”相同的結果。 我對此進行了研究,在大多數情況下,建議使用 std::vector 但在這種特定情況下,由於我教授的要求,有必要使用 char * 。 我希望你能幫助我,並提前致謝。

sizeof(contenido)計算為指針的大小,在您的平台上為 8。

要恢復字符串的內容,您需要使用字符串的長度作為read參數。

size_t Archivo::lee(size_t nbytes) {
  contenido = new char[nbytes];
  cout << "contenido: " << sizeof(contenido) << endl;
  nbytes = read(fd, contenido, nbytes);
  return nbytes;
}

如果contenido應該是一個空終止字符串,您可能需要為其分配一個多字節並確保添加終止空字符。

size_t Archivo::lee(size_t nbytes) {
  contenido = new char[nbytes+1];
  cout << "contenido: " << sizeof(contenido) << endl;
  nbytes = read(fd, contenido, nbytpes);
  contenido[nbytes] = '\0';
  return nbytes;
}

您在指針上調用sizeof()運算符,因此您獲得指針的大小而不是它指向的內容的大小。 內存中的指針通常類似於另一個常規變量(例如 int),只是它包含一個地址而不是實際值。 你總是得到數字 8 可能是因為你的機器是 64 位的,所以指針應該能夠保存 64 位空間中的任何地址。 (8 字節 = 64 位)

如果您想獲得內容的字節大小(您分配的內存),您應該使用sizeof()字符的大小(內容的類型sizeof() ,然后將其乘以分配的字符數,像這樣:

sizeof(char)*nbytes

暫無
暫無

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

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