[英]How to understand “C++ allows sizeof(char*) != sizeof(int*)”?
[英]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.