таңбалар массасының өлшемі және таңба көрсеткішінің өлшемі

Менде C кодының бөлігі бар және sizeof (...) функциясы қалай жұмыс істейтінін түсінбеймін:

#include 

int main(){
   const char  firstname[] = "bobby";
   const char* lastname = "eraserhead";
   printf("%lu\n", sizeof(firstname) + sizeof(lastname));
   return 0;
}

Жоғарыда көрсетілген кодтың өлшемі (аты) 6, ал өлшемі (тегі) - 8.

Бірақ bobby - 5 таңба кең және eraserhead 11 ені. 16 деп күтемін.

Неге өлшемі таңбалар массивіне және таңбаға арналған көрсеткіш үшін әртүрлі әрекет етеді?

Кез-келген адам түсіндіре ала ма?

16
sizeof және strlen() екеуі де size_t түрінің нәтижесін береді. size_t мәндерін басып шығару үшін % zu емес, % lu қолданыңыз. Немесе егер сіздің компиляторыңыз % zu қолдамайтын болса, белгілі бір түрге айналдырып, сол түрге сәйкес пішімді пайдаланыңыз.
қосылды автор Keith Thompson, көзі

9 жауаптар

firstname is a char array carrying a trailing 0-terminator. lastname is a pointer. On a 64bit system pointers are 8 byte wide.

24
қосылды
s (немесе s ) жолын сақтауға қажет байттардың саны strlen (s) + 1 болып табылады.
қосылды автор Keith Thompson, көзі
@ФФоратор: a «жол» C-де '\' 0 ' таңба арқылы тоқтатылған таңбалардың кезектілігін білдіретін strlen() «жол» ұзындығын алу үшін. Бұл «нақты» кейіпкерлердің массивтерінде, сондай-ақ соңғы нұсқаушыларды көрсететін сияқты жұмыс істейді. Бұл тұрғыда кейіпкерлердің қалай және қайда сақталуы маңызды емес. Шын мәнінде, жолды ұстайтын айнымалы жолдың ұзындығына сәйкес келуі міндетті емес. Егер екінші жағынан айнымалы мән пайдаланылатын байт саны болса, sizeof операторын пайдаланыңыз.
қосылды автор alk, көзі
Өйткені ОР жолдың ұзындығын білуге ​​тырысады, яғни жолдың ұзындығын және екеуін де «неге 5 + 10 = 15?» деп қосқанда, қосуға болады ма? sizeof немесе strlen() арқылы жолдың ұзындығын алуға бола ма? сен не айтасың?
қосылды автор 0decimal0, көзі

firstname is a char array carrying a trailing 0-terminator. lastname is a pointer. On a 64bit system pointers are 8 byte wide.

24
қосылды
s (немесе s ) жолын сақтауға қажет байттардың саны strlen (s) + 1 болып табылады.
қосылды автор Keith Thompson, көзі
@ФФоратор: a «жол» C-де '\' 0 ' таңба арқылы тоқтатылған таңбалардың кезектілігін білдіретін strlen() «жол» ұзындығын алу үшін. Бұл «нақты» кейіпкерлердің массивтерінде, сондай-ақ соңғы нұсқаушыларды көрсететін сияқты жұмыс істейді. Бұл тұрғыда кейіпкерлердің қалай және қайда сақталуы маңызды емес. Шын мәнінде, жолды ұстайтын айнымалы жолдың ұзындығына сәйкес келуі міндетті емес. Егер екінші жағынан айнымалы мән пайдаланылатын байт саны болса, sizeof операторын пайдаланыңыз.
қосылды автор alk, көзі
Өйткені ОР жолдың ұзындығын білуге ​​тырысады, яғни жолдың ұзындығын және екеуін де «неге 5 + 10 = 15?» деп қосқанда, қосуға болады ма? sizeof немесе strlen() арқылы жолдың ұзындығын алуға бола ма? сен не айтасың?
қосылды автор 0decimal0, көзі

sizeof an array is the size of the total array, in the case of "bobby", it's 5 characters and one trailing \0 which equals 6.

sizeof a pointer is the size of the pointer, which is normally 4 bytes in 32-bit machine and 8 bytes in 64-bit machine.

6
қосылды

sizeof an array is the size of the total array, in the case of "bobby", it's 5 characters and one trailing \0 which equals 6.

sizeof a pointer is the size of the pointer, which is normally 4 bytes in 32-bit machine and 8 bytes in 64-bit machine.

6
қосылды

Бірінші массивтің өлшемі bobby \ 0 өлшемі болып табылады. \ 0 - терминатор таңбасы, сондықтан ол 6.

Екінші өлшем - 64 бит жүйеңіздегі 8 байт көрсеткіштің өлшемі. Оның мөлшері тағайындалған жолдың ұзындығына байланысты емес.

3
қосылды

Бірінші массивтің өлшемі bobby \ 0 өлшемі болып табылады. \ 0 - терминатор таңбасы, сондықтан ол 6.

Екінші өлшем - 64 бит жүйеңіздегі 8 байт көрсеткіштің өлшемі. Оның мөлшері тағайындалған жолдың ұзындығына байланысты емес.

3
қосылды

firstname is an array of 6 chars, including the terminating '\0' character at the end of the string. That's why sizeof firstname is 6.

lastname is a pointer to char, and will have whatever size such a pointer has on your system. Typical values are 4 and 8. The size of lastname will be the same no matter what it is pointing to (or even if it is pointing to nothing at all).

2
қосылды

firstname[] is null-terminated, which adds 1 to the length.

sizeof(lastname) is giving the size of the pointer instead of the actual value.

2
қосылды
* тегі - бұл char , сондықтан sizeof * lastname әрқашан 1 болады.
қосылды автор caf, көзі

firstname[] is null-terminated, which adds 1 to the length.

sizeof(lastname) is giving the size of the pointer instead of the actual value.

2
қосылды
* тегі - бұл char , сондықтан sizeof * lastname әрқашан 1 болады.
қосылды автор caf, көзі