бұл құрылымның өлшемі қандай? және неге?

келесі бағдарлама өнімді шығаруды береді. Ол 8 sizeof (int) + sizeof (unsigned int) шығарады деп ойладым,

#include
#include
int main()
{
        struct node
        {
                int a;
                struct node * next;
        };
        struct node * p= (struct node *) malloc( sizeof( struct node));
        printf("%d", sizeof( p));
}
1
Сіз нысанның орнына көрсеткіштің өлшемін алып отырсыз.
қосылды автор Mysticial, көзі
Бұл 32-биттік немесе 64-биттерді құрастырып жатқаныңызды білу маңызды, себебі бұл int және көрсеткішінің қаншалықты үлкен екенін көрсетеді.
қосылды автор Raceimaztion, көзі
Бұл 32-биттік немесе 64-биттерді құрастырып жатқаныңызды білу маңызды, себебі бұл int және көрсеткішінің қаншалықты үлкен екенін көрсетеді.
қосылды автор Raceimaztion, көзі

6 жауаптар

Бұл кодта p көрсеткіші болып табылады, сондықтан сіз жай ғана көрсеткіштің өлшемін басып шығарасыз (бұл сіздің компиляторларыңыз/OS комбинацияңызда анықталған 4 байт). Егер құрылымның өлшемін қаласаңыз, сізге sizeof (* p) басып шығару қажет. Сондай-ақ, көрсетілгендей, size_t үшін «% d» функциясын міндетті түрде жұмыс істемейді («% zu» дұрыс, бірақ% d нақты әлемдегі компиляторлар/OS жүйелерінде дұрыс болады). Сондай-ақ, құрылымның өлшемі «8» болуы керек деп ойлаған жөн емес. Көрсеткіштер үлкенірек болуы мүмкін немесе компилятор бұл құрылымды біртүрлі тәсілмен төңкеріп немесе үйлестіруі мүмкін.

2
қосылды

Бұл кодта p көрсеткіші болып табылады, сондықтан сіз жай ғана көрсеткіштің өлшемін басып шығарасыз (бұл сіздің компиляторларыңыз/OS комбинацияңызда анықталған 4 байт). Егер құрылымның өлшемін қаласаңыз, сізге sizeof (* p) басып шығару қажет. Сондай-ақ, көрсетілгендей, size_t үшін «% d» функциясын міндетті түрде жұмыс істемейді («% zu» дұрыс, бірақ% d нақты әлемдегі компиляторлар/OS жүйелерінде дұрыс болады). Сондай-ақ, құрылымның өлшемі «8» болуы керек деп ойлаған жөн емес. Көрсеткіштер үлкенірек болуы мүмкін немесе компилятор бұл құрылымды біртүрлі тәсілмен төңкеріп немесе үйлестіруі мүмкін.

2
қосылды

p is just a pointer. Its size depends on ABI, which is in your case 4.

1
қосылды
Сіз көрсеткіштің өлшемі екеніңіз дұрыс. Бұл өлшемнің қандай екенін түсіну дұрыс емес.
қосылды автор Genia S., көзі
Жоқ, белгішенің өлшемі болады, ол белгісіз int өлшемінің болуы мүмкін немесе болмауы мүмкін.
қосылды автор Lee Daniel Crocker, көзі

p is just a pointer. Its size depends on ABI, which is in your case 4.

1
қосылды
Сіз көрсеткіштің өлшемі екеніңіз дұрыс. Бұл өлшемнің қандай екенін түсіну дұрыс емес.
қосылды автор Genia S., көзі
Жоқ, белгішенің өлшемі болады, ол белгісіз int өлшемінің болуы мүмкін немесе болмауы мүмкін.
қосылды автор Lee Daniel Crocker, көзі

Және түзету жауап: шығуыңыз, егер бар болса, анықталмайды, себебі printf() қоңырауына қате пішім ерекшелігі пайдаланылады. sizeof() орнына size_t түрінің нысанын береді % zu қолданған жөн.

Осылайша, сіздің бағдарламаңыз белгісіз мінез-құлықты шақырады және қалаған нәрсені жасауға (және басып шығаруға) еркін.

1
қосылды
sizeof (x) size_t unsigned int кодын бермейді. Көптеген жүйелерде бұл unsigned int сияқты бірдей, бірақ ол міндетті емес. % zu - size_t үшін тиісті пішім спецификаторы, ал % d - қорқынышты нәрселерге әкелуі мүмкін.
қосылды автор amalloy, көзі
Интеграцияланбаған инт-ді инсталляциялауға белгісіз мінез-құлыққа әкелмейді деп ойлаймын. Ол 255 сияқты кейбір нәрсеге 8-бит жүйелерінде -127 түріне айналуы мүмкін. Бірақ сенімді емес. Белгісіз мінез-құлық көзі өте жоғары бағаланады!
қосылды автор Atmaram Shetye, көзі

Және түзету жауап: шығуыңыз, егер бар болса, анықталмайды, себебі printf() қоңырауына қате пішім ерекшелігі пайдаланылады. sizeof() орнына size_t түрінің нысанын береді % zu қолданған жөн.

Осылайша, сіздің бағдарламаңыз белгісіз мінез-құлықты шақырады және қалаған нәрсені жасауға (және басып шығаруға) еркін.

1
қосылды
sizeof (x) size_t unsigned int кодын бермейді. Көптеген жүйелерде бұл unsigned int сияқты бірдей, бірақ ол міндетті емес. % zu - size_t үшін тиісті пішім спецификаторы, ал % d - қорқынышты нәрселерге әкелуі мүмкін.
қосылды автор amalloy, көзі
Интеграцияланбаған инт-ді инсталляциялауға белгісіз мінез-құлыққа әкелмейді деп ойлаймын. Ол 255 сияқты кейбір нәрсеге 8-бит жүйелерінде -127 түріне айналуы мүмкін. Бірақ сенімді емес. Белгісіз мінез-құлық көзі өте жоғары бағаланады!
қосылды автор Atmaram Shetye, көзі