Learn C Programming

lesson ā§§ / ā§§ā§Ļ ¡ Pointer āφāϰ memory

Module ā§§ā§§ ¡ Pointer āφāϰ memory

Memory āφāϰ āĻ āĻŋāĻ•āĻžāύāĻž: āĻĒā§āϰāϤāĻŋāϟāĻž āĻŦāĻžāĻ•ā§āϏ⧇āϰ āĻāĻ•āϟāĻž āύāĻŽā§āĻŦāϰ āφāϛ⧇

FreeāĻĒāĻĄāĻŧāĻž

āĻāχ lesson-āĻ āϝāĻž āĻļāĻŋāĻ–āĻŦ⧇

  • & āφāϰ %p āĻĻāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻž variable āĻŦāĻž array-āϰ āĻāĻ•āϟāĻž āĻŦāĻžāĻ•ā§āϏ āϕ⧋āĻĨāĻžāϝāĻŧ āĻĨāĻžāϕ⧇, print āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇, āφāϰ (void *) cast-āϟāĻž āϕ⧇āύ āϞāĻžāϗ⧇, āĻŦ⧁āĻāĻŋāϝāĻŧ⧇ āĻŦāϞāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āĨ¤
  • āĻāĻ•āχ program-āĻāϰ āĻĻ⧁āχāϟāĻž run āĻĒāĻĄāĻŧ⧇ āĻŦāϞāϤ⧇ āĻĒāĻžāϰāĻŦ⧇ āϕ⧀ āĻŦāĻĻāϞāĻžāϝāĻŧ, āϕ⧀ āĻāĻ•āχ āĻĨāĻžāϕ⧇, āφāϰ āĻāĻ•āϟāĻž array āϕ⧇āύ āĻ āĻŋāĻ• āĻāĻ• āĻŦāĻžāĻ•ā§āϏ⧇āϰ sizeof āĻ•āϰ⧇ āĻāĻ—ā§‹āϝāĻŧāĨ¤
  • Stack āφāϰ static area-āϏāĻš memory-āϰ āĻāĻ•āϟāĻž āĻ›āĻŦāĻŋ āĻāρāϕ⧇ āĻŦ⧁āĻāĻŋāϝāĻŧ⧇ āĻŦāϞāϤ⧇ āĻĒāĻžāϰāĻŦ⧇, scanf-āĻāϰ āϕ⧇āύ &age āϞāĻžāϗ⧇, āĻ…āĻĨāϚ array-āϰ āύāĻžāĻŽā§‡āϰ āφāϗ⧇ ampersand āϞāĻžāϗ⧇ āύāĻžāĨ¤

āφāϟ module āϧāϰ⧇ Maria scanf("%d", &n) āϞāĻŋāϖ⧇ āφāϏāϛ⧇, āϤāĻŦ⧁ Module 3 āϝ⧇ āĻĒā§āϰāĻļā§āύāϟāĻž āĻ–ā§‹āϞāĻž āϰ⧇āϖ⧇ āĻ—āĻŋāϝāĻŧ⧇āĻ›āĻŋāϞ, āϏ⧇āϟāĻž āĻ“āϰ āĻŽāĻžāĻĨāĻž āĻĨ⧇āϕ⧇ āϝāĻžāϝāĻŧāύāĻŋāĨ¤ printf-āĻāϰ āϤ⧋ āĻ•āĻ–āύ⧋ ampersand āϞāĻžāϗ⧇ āύāĻž, āϤāĻžāĻšāϞ⧇ scanf-āĻāϰ āϞāĻžāϗ⧇ āϕ⧇āύ? Module 3 āĻŦāϞ⧇āĻ›āĻŋāϞ, āĻāϟāĻž āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž āĻšāĻžāϤ⧇ āĻĻ⧇āϝāĻŧ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ āĻŋāĻ•āĻžāύāĻž āĻĻ⧇āĻ–āϤ⧇ āϕ⧇āĻŽāύ, āϕ⧇āω āĻ“āϕ⧇ āĻĻ⧇āĻ–āĻžāϝāĻŧāύāĻŋāĨ¤ āĻāχ lesson Playground-āĻāϰ āĻĻ⧁āχāϟāĻž run āĻĨ⧇āϕ⧇ āϏāĻ¤ā§āϝāĻŋāĻ•āĻžāϰ⧇āϰ āĻ āĻŋāĻ•āĻžāύāĻž print āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻžāĻŦ⧇, āϤāĻžāϰāĻĒāϰ āĻāĻ• āĻŦāĻžāĻ•ā§āϝ⧇ āĻ“āϰ āĻĒā§āϰāĻļā§āύ⧇āϰ āωāĻ¤ā§āϤāϰ āĻĻ⧇āĻŦ⧇āĨ¤

Memory āĻšāϞ⧋ āύāĻŽā§āĻŦāϰ āĻĻ⧇āĻ“āϝāĻŧāĻž byte-āĻāϰ āĻāĻ•āϟāĻž āϏāĻžāϰāĻŋ

Byte āĻŽāĻžāύ⧇ 8 bit, sizeof āϝ⧇ āĻāĻ•āϕ⧇ āĻ—ā§‹āύ⧇ (Module 2 lesson 5)āĨ¤ āϚāϞāĻŽāĻžāύ āĻāĻ•āϟāĻž program-āĻāϰ memory āĻšāϞ⧋ byte-āĻāϰ āĻŦāĻŋāĻļāĻžāϞ āϞāĻŽā§āĻŦāĻž āĻāĻ•āϟāĻž āϏāĻžāϰāĻŋāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž byte-āĻāϰ āĻāĻ•āϟāĻž āύāĻŽā§āĻŦāϰ āφāϛ⧇, āĻŽāĻžāύ⧇ āϏāĻžāϰāĻŋāϤ⧇ āϤāĻžāϰ āϜāĻžāϝāĻŧāĻ—āĻž, āφāϰ āϏ⧇āχ āύāĻŽā§āĻŦāϰāϟāĻžāχ āϤāĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻž (address)āĨ¤

āĻāĻ•āϟāĻž variable āϤāĻžāϰ type āϝāϤ byte āϚāĻžāϝāĻŧ, āϤāϤāϗ⧁āϞ⧋ byte āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āύ⧇āϝāĻŧāĨ¤ āϤāĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻšāϞ⧋ āϤāĻžāϰ āĻĒā§āϰāĻĨāĻŽ byte-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžāĨ¤ Module 2 lesson 1 āĻāĻ•āϟāĻž run āĻĨ⧇āϕ⧇ āϤāĻŋāύāϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž print āĻ•āϰ⧇āĻ›āĻŋāϞ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏ⧇āϗ⧁āϞ⧋ āύāĻŋāϝāĻŧ⧇ āϕ⧋āύ⧋ āĻ•āĻĨāĻž āĻĻ⧇āϝāĻŧāύāĻŋāĨ¤ āĻāχ lesson āϏ⧇āϗ⧁āϞ⧋ āĻŽā§‡āĻĒ⧇ āĻĻ⧇āĻ–āĻŦ⧇āĨ¤

āϤāĻžāχ āĻĒā§āϰāϤāĻŋāϟāĻž variable-āĻāϰ āϤāĻŋāύāϟāĻž āĻĒāϰāĻŋāϚāϝāĻŧ: āϤāĻžāϰ āĻŽāĻžāύ, āϤāĻžāϰ āĻŽāĻžāĻĒ, āφāϰ āϤāĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻžāĨ¤

Address-of operator āĻāĻ•āϟāĻž variable-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻĻ⧇āϝāĻŧ

Variable-āĻāϰ āύāĻžāĻŽā§‡āϰ āφāϗ⧇ āĻāĻ•āϟāĻž ampersand āĻŦāϏāĻžāϞ⧇āχ āϤāĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤ āĻāχ &-āĻāϰ āύāĻžāĻŽ address-of operator, āφāϰ &a āĻĒāĻĄāĻŧā§‹ "a-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž"āĨ¤ āϝāĻžāϰ āĻāĻ•āϟāĻž āĻŦāĻžāĻ•ā§āϏ āφāϛ⧇, āĻāĻŽāύ āϝ⧇āϕ⧋āύ⧋ āĻ•āĻŋāϛ⧁āϰ āωāĻĒāϰ āĻāϟāĻž āϚāϞ⧇: āĻāĻ•āϟāĻž variable, āĻŦāĻž &marks[2]-āĻāϰ āĻŽāϤ⧋ āĻāĻ•āϟāĻž āĻŦāĻžāĻ•ā§āϏāĨ¤

āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž print āĻ•āϰāĻž

printf("%p\n", (void *)&name);
  • &name āĻŽāĻžāύ⧇ name-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž: āϏ⧇ āϕ⧋āĻĨāĻžāϝāĻŧ āĻĨāĻžāϕ⧇, āĻ­āĻŋāϤāϰ⧇ āϕ⧀ āφāϛ⧇ āϏ⧇āϟāĻž āύāĻžāĨ¤
  • %p āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž print āĻ•āϰ⧇; Playground-āĻ āϏ⧇āϟāĻž āφāϏ⧇ 0x āφāϰ hexadecimal digit āĻšāϝāĻŧ⧇āĨ¤
  • (void *) āĻāĻ•āϟāĻž cast: %p āϚāĻžāϝāĻŧ āĻāĻ•āϟāĻž void *, āĻŽāĻžāύ⧇ C-āϰ āϏāĻžāϧāĻžāϰāĻŖ āĻ āĻŋāĻ•āĻžāύāĻžāϰ type, āφāϰ cast-āϟāĻž āĻ āĻŋāĻ• āϏ⧇āϟāĻžāχ āĻŦāĻžāύāĻŋāϝāĻŧ⧇ āĻĻ⧇āϝāĻŧāĨ¤

Hexadecimal āĻšāϞ⧋ Module 1 lesson 4-āĻāϰ base 16: 9-āĻāϰ āĻĒāϰ⧇ āφāϏ⧇ a āĻĨ⧇āϕ⧇ f, āϝāĻžāĻĻ⧇āϰ āĻŽāĻžāύ 10 āĻĨ⧇āϕ⧇ 15āĨ¤ āϏāĻžāĻŽāύ⧇āϰ 0x āĻŦāϞ⧇ āĻĻ⧇āϝāĻŧ āϏāĻ‚āĻ–ā§āϝāĻžāϟāĻž base 16-āĻ āϞ⧇āĻ–āĻž, āĻ āĻŋāĻ• Module 3 lesson 1-āĻāϰ āĻŽāϤ⧋āĨ¤

āĻāχ program āϏāĻžāϤāϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž print āĻ•āϰ⧇: āĻĒā§āϰāĻĨāĻŽā§‡ āϤāĻŋāύāϟāĻž variable-āĻāϰ, āϤāĻžāϰāĻĒāϰ āĻāĻ•āϟāĻž array-āϰ āϚāĻžāϰāϟāĻž āĻŦāĻžāĻ•ā§āϏ⧇āϰāĨ¤

#include <stdio.h>

int main(void)
{
    int a = 1;
    int b = 2;
    double d = 3.0;
    int marks[4] = {70, 80, 90, 60};

    printf("&a = %p\n", (void *)&a);
    printf("&b = %p\n", (void *)&b);
    printf("&d = %p\n", (void *)&d);
    for (int i = 0; i < 4; i++) {
        printf("&marks[%d] = %p\n", i, (void *)&marks[i]);
    }
    printf("%d %d %.1f %d\n", a, b, d, marks[0]);
    return 0;
}

āϚāĻžāϞāĻžāύ⧋āϰ āφāϗ⧇ trace āĻ•āϰ⧋āĨ¤ āĻāχ table-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžāϗ⧁āϞ⧋ āĻŦāĻžāύāĻžāύ⧋: āϛ⧋āϟ, āφāϰ decimal-āĻ, āϝāĻžāϤ⧇ āϏāĻšāĻœā§‡ āĻĒāĻĄāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤ āφāϏāϞ āĻ āĻŋāĻ•āĻžāύāĻž hexadecimal-āĻ, āφāϰ āĻĒā§āϰāϤāĻŋ run-āĻ āĻŦāĻĻāϞāĻžāϝāĻŧāĨ¤

āύāĻžāĻŽTypeByteāĻŦāĻžāύāĻžāύ⧋ āĻ āĻŋāĻ•āĻžāύāĻžāĻŽāĻžāύ
aint410001
bint410042
ddouble810083.0
marks[0]int4101670
marks[1]int4102080
marks[2]int4102490
marks[3]int4102860
āϏāĻžāϤāϟāĻž āĻŦāĻžāĻ•ā§āϏ, āĻŽāĻžāĻĨāĻžāϝāĻŧ āϞ⧇āĻ–āĻž āϤāĻžāĻĻ⧇āϰ āĻŦāĻžāύāĻžāύ⧋ āĻ āĻŋāĻ•āĻžāύāĻž āωāĻĒāϰ⧇ āĻŦāĻžāύāĻžāύ⧋ āĻ āĻŋāĻ•āĻžāύāĻž, āύāĻŋāĻšā§‡ āύāĻžāĻŽ, āĻĒā§āϰāϤāĻŋ byte-āĻ āĻāĻ•āϟāĻž āĻĻāĻžāĻ— 1000 1004 1008 1016 1020 1024 1028 1 2 3.0 70 80 90 60 a b d marks[0] marks[1] marks[2] marks[3] 4 byte 4 byte 8 byte, 1008 āĻĨ⧇āϕ⧇ 1015 marks: 4āϟāĻž āĻŦāĻžāĻ•ā§āϏ, āĻĒā§āϰāϤāĻŋāϟāĻž āφāϗ⧇āϰāϟāĻžāϰ 4 byte āĻĒāϰ⧇ d āĻāĻ•āϟāĻž int-āĻāϰ āĻĻā§āĻŦāĻŋāϗ⧁āĻŖ āϚāĻ“āĻĄāĻŧāĻž, āϤāĻžāχ marks āĻļ⧁āϰ⧁ āĻšāϝāĻŧ 1016-āĻ, 1012-āĻ āύāĻžāĨ¤ āφāϏāϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻĒā§āϰāϤāĻŋ run-āĻ āĻŦāĻĻāϞāĻžāϝāĻŧāĨ¤ āĻāχ āĻĢāĻžāρāĻ•āϗ⧁āϞ⧋ āĻāĻ•āχ āĻĨāĻžāϕ⧇āĨ¤

āĻļ⧇āώ āϞāĻžāχāύāϟāĻž āĻĒā§āϰāϤāĻŋāϟāĻž run-āĻ print āĻ•āϰ⧇ 1 2 3.0 70āĨ¤ āύāĻĄāĻŧ⧇ āĻļ⧁āϧ⧁ āϤāĻžāϰ āωāĻĒāϰ⧇āϰ āϏāĻžāϤāϟāĻž āĻ āĻŋāĻ•āĻžāύāĻžāĨ¤

āϤāĻžāχ &x āĻāĻ•āϟāĻž āϏāĻ‚āĻ–ā§āϝāĻž: x-āĻāϰ āĻĒā§āϰāĻĨāĻŽ byte-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžāĨ¤

Playground-āĻ āĻĻ⧁āχāϟāĻž run: āύāϤ⧁āύ āϏāĻ‚āĻ–ā§āϝāĻž, āĻāĻ•āχ āĻĻā§‚āϰāĻ¤ā§āĻŦ

āĻāχ āĻšāϞ⧋ Playground-āĻ āĻ“āχ program-āĻāϰ āĻĻ⧁āχāϟāĻž run, āĻŽāĻžāĻā§‡ āĻ•āĻŋāϛ⧁āχ āĻŦāĻĻāϞāĻžāύ⧋ āĻšāϝāĻŧāύāĻŋāĨ¤ āĻļ⧇āώ āĻ•āϞāĻžāĻŽā§‡ āφāϛ⧇, āĻĒā§āϰāϤāĻŋāϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž &a āĻĨ⧇āϕ⧇ āĻ•āϤ byte āĻĻā§‚āϰ⧇āĨ¤

āϞāĻžāχāύRun 1Run 2&a-āĻāϰ āĻ•āϤ byte āĻĒāϰ⧇
&a0x7ffe8f424bc00x7ffddb90d2300
&b0x7ffe8f424bc40x7ffddb90d2344
&d0x7ffe8f424bc80x7ffddb90d2388
&marks[0]0x7ffe8f424bd00x7ffddb90d24016
&marks[1]0x7ffe8f424bd40x7ffddb90d24420
&marks[2]0x7ffe8f424bd80x7ffddb90d24824
&marks[3]0x7ffe8f424bdc0x7ffddb90d24c28

āĻĻā§‚āϰāĻ¤ā§āĻŦ āĻĒāĻĄāĻŧāϤ⧇ āĻļ⧇āώ⧇āϰ digit-āϗ⧁āϞ⧋ āĻŽā§‡āϞāĻžāĻ“āĨ¤ bc0 āĻĨ⧇āϕ⧇ bc4 āĻšāϞ⧋ 4āĨ¤ bc8 āĻĨ⧇āϕ⧇ bd0 āĻšāϞ⧋ 8, āĻ•āĻžāϰāĻŖ c8-āĻāϰ āĻĒāϰ⧇ āφāϏ⧇ c9, āϤāĻžāϰāĻĒāϰ ca āĻĨ⧇āϕ⧇ cf, āϤāĻžāϰāĻĒāϰ d0āĨ¤ āφāϰ c āĻŽāĻžāύ⧇ 12, āϤāĻžāχ bd8 āĻĨ⧇āϕ⧇ bdc āĻšāϞ⧋ 4āĨ¤

āĻĒā§āϰāϤāĻŋāϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž āĻŦāĻĻāϞ⧇ āϗ⧇āϛ⧇, āĻ…āĻĨāϚ āĻĒā§āϰāϤāĻŋāϟāĻž āĻĻā§‚āϰāĻ¤ā§āĻŦ āĻāĻ•āχ āφāϛ⧇āĨ¤ āĻāϰ āĻĒāĻŋāĻ›āύ⧇ āφāϛ⧇ ASLR, āĻŽāĻžāύ⧇ address space layout randomisationāĨ¤ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ run-āĻāϰ āϏāĻŽāϝāĻŧ system program-āĻāϰ memory āĻļ⧁āϰ⧁ āĻ•āϰ⧇ āĻāĻ•āϟāĻž āĻāϞ⧋āĻŽā§‡āϞ⧋ āϜāĻžāϝāĻŧāĻ—āĻž āĻĨ⧇āϕ⧇āĨ¤ āϤāĻžāχ print āĻšāĻ“āϝāĻŧāĻž āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž āϏāĻ¤ā§āϝāĻŋ āĻļ⧁āϧ⧁ āϏ⧇āχ run-āĻāϰ āϜāĻ¨ā§āϝ, āϝ⧇āϟāĻž āĻ“āϟāĻž print āĻ•āϰ⧇āϛ⧇āĨ¤

āĻĻā§‚āϰāĻ¤ā§āĻŦāϗ⧁āϞ⧋āϰ āĻ­āĻŋāϤāϰ⧇ āφāϏāϞ⧇ āĻĻ⧁āχ āϰāĻ•āĻŽ āϤāĻĨā§āϝ āφāϛ⧇āĨ¤ marks-āĻāϰ āĻ­āĻŋāϤāϰ⧇ 4 āĻ•āϰ⧇ āϧāĻžāĻĒāϟāĻž C-āϰ āύāĻŋāϝāĻŧāĻŽ, āĻ•āĻžāϰāĻŖ array-āϰ āĻŦāĻžāĻ•ā§āϏāϗ⧁āϞ⧋ contiguous, āĻŽāĻžāύ⧇ āĻŽāĻžāĻā§‡ āĻĢāĻžāρāĻ• āĻ›āĻžāĻĄāĻŧāĻž āĻĒāϰāĻĒāϰ āĻŦāϏ⧇ (Module 9 lesson 01)āĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ a, b āφāϰ d āϕ⧋āύ āĻ•ā§āϰāĻŽā§‡ āĻŦāϏāĻŦ⧇, āϏ⧇āϟāĻž āĻļ⧁āϧ⧁āχ GCC-āϰ āĻĒāĻ›āĻ¨ā§āĻĻāĨ¤ Module 2 lesson 1-āĻāϰ run āϤāĻŋāύāϟāĻž int-āϕ⧇ āĻŦāϏāĻŋāϝāĻŧ⧇āĻ›āĻŋāϞ āωāĻ˛ā§āĻŸā§‹ āĻ•ā§āϰāĻŽā§‡, āĻ•āĻŽāϤ⧇ āĻĨāĻžāĻ•āĻž āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ, āφāϰ āϏ⧇āϟāĻžāĻ“ āύāĻŋāϝāĻŧāĻŽā§‡āϰ āĻŽāĻ§ā§āϝ⧇āχ āĻ›āĻŋāϞāĨ¤

āϤāĻžāχ āĻ āĻŋāĻ•āĻžāύāĻž āĻŽā§‡āϞāĻžāĻ“ āĻāĻ•āχ run-āĻāϰ āĻ­āĻŋāϤāϰ⧇, āĻ•āĻ–āύ⧋ āĻĻ⧁āχ run-āĻāϰ āĻŽāĻ§ā§āϝ⧇ āύāĻžāĨ¤

Array-āϰ āϧāĻžāĻĒ: āĻāĻ• āĻŦāĻžāĻ•ā§āϏ⧇āϰ sizeof

Module 9 lesson 01 āĻ•āĻĨāĻž āĻĻāĻŋāϝāĻŧ⧇āĻ›āĻŋāϞ, āĻŦāĻžāĻ•ā§āϏ i āϕ⧋āĻĨāĻžāϝāĻŧ āĻļ⧁āϰ⧁ āĻšāϝāĻŧ, āϏ⧇āϟāĻž Module 11 print āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻžāĻŦ⧇āĨ¤ āĻ“āĻĒāϰ⧇āϰ run āĻĻ⧁āχāϟāĻž āĻ āĻŋāĻ• āϏ⧇āϟāĻžāχ āĻ•āϰ⧇āϛ⧇: marks-āĻāϰ āĻŦāĻžāĻ•ā§āϏāϗ⧁āϞ⧋ 4 byte āĻĒāϰāĻĒāϰ āĻŦāϏ⧇āĨ¤ āĻāχ āϧāĻžāĻĒāϟāĻž āĻšāϞ⧋ sizeof marks[0], āĻŽāĻžāύ⧇ āĻāĻ• āĻŦāĻžāĻ•ā§āϏ⧇āϰ āĻŽāĻžāĻĒāĨ¤

āϧāĻžāĻĒāϟāĻž type-āĻāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇āĨ¤ āϚāĻžāϰāϟāĻž āϛ⧋āϟ array-āϰ āĻŦāĻžāĻ•ā§āϏ 0 āφāϰ āĻŦāĻžāĻ•ā§āϏ 1 print āĻ•āϰ⧇, āĻāĻŽāύ āĻāĻ•āϟāĻž program Playground-āĻ āĻāĻ•āĻŦāĻžāϰ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āĻĒāĻžāĻ“āϝāĻŧāĻž āϗ⧇āϛ⧇ āĻāϟāĻžāĨ¤

Array-āϰ typeāĻŦāĻžāĻ•ā§āϏ 0āĻŦāĻžāĻ•ā§āϏ 1āϧāĻžāĻĒ, byte-āĻ
int0x7ffd8d6d38500x7ffd8d6d38544
char0x7ffd8d6d384d0x7ffd8d6d384e1
double0x7ffd8d6d38600x7ffd8d6d38688
long long0x7ffd8d6d38800x7ffd8d6d38888

āĻ“āχ run-āĻāϰ sizeof-āĻāϰ āϞāĻžāχāύ āĻŦāϞ⧇āϛ⧇ 4, 1, 8 āφāϰ 8, āϧāĻžāĻĒāϗ⧁āϞ⧋āϰ āϏāĻžāĻĨ⧇ āĻšā§āĻŦāĻšā§ āĻāĻ•āĨ¤ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻžāϰ āύāĻŋāĻœā§‡āϰ āĻŽāĻžāĻĒāĻ“ āĻĻāĻŋāϝāĻŧ⧇āϛ⧇: 8 byte, āϏ⧇āϟāĻž āϝ⧇āĻ–āĻžāύ⧇āχ āύāĻŋāϝāĻŧ⧇ āϝāĻžāĻ•āĨ¤

āϤāĻžāχ āĻŦāĻžāĻ•ā§āϏ i āĻļ⧁āϰ⧁ āĻšāϝāĻŧ āĻŦāĻžāĻ•ā§āϏ 0 āĻĨ⧇āϕ⧇ i āϗ⧁āĻŖ āĻāĻ• āĻŦāĻžāĻ•ā§āϏ⧇āϰ sizeof āĻĒāϰ⧇, āφāϰ machine marks[i] āϖ⧁āρāĻœā§‡ āĻĒāĻžāϝāĻŧ āĻ āĻŋāĻ• āĻāχ āĻšāĻŋāϏāĻžāĻŦ⧇āχāĨ¤

Memory-āϰ āĻ›āĻŦāĻŋ: code, static area āφāϰ stack

Module 7 lesson 5 āĻ•āĻĨāĻž āĻĻāĻŋāϝāĻŧ⧇āĻ›āĻŋāϞ, memory-āϰ āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻ āĻžāĻ• āĻ›āĻŦāĻŋ āφāρāĻ•āĻž āĻšāĻŦ⧇āĨ¤ āĻāχ āĻšāϞ⧋ āϏ⧇āχ āĻ›āĻŦāĻŋ, Playground-āĻāϰ Linux-āĻ āϚāϞāĻž āĻāĻ•āϟāĻž program-āĻāϰ; āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϛ⧋āϟ āĻ āĻŋāĻ•āĻžāύāĻž āύāĻŋāĻšā§‡āĨ¤

Linux-āĻ āĻāĻ•āϟāĻž program-āĻāϰ memory: code, static area, heap āφāϰ stack āĻāĻ•āϟāĻž program-āĻāϰ memory, āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϛ⧋āϟ āĻ āĻŋāĻ•āĻžāύāĻž āύāĻŋāĻšā§‡ āĻŦāĻĄāĻŧ āĻ āĻŋāĻ•āĻžāύāĻž 0x7ff... āϛ⧋āϟ āĻ āĻŋāĻ•āĻžāύāĻž main-āĻāϰ frame: a, b, d, marks main āϝ⧇ call āĻ•āϰ⧇āϛ⧇, āϤāĻžāϰ frame āĻŦāĻŋāĻļāĻžāϞ āĻāĻ•āϟāĻž āĻĢāĻžāρāĻ• heap: Module 14 static area code stack āĻĒā§āϰāϤāĻŋāϟāĻž āϚāϞāĻŽāĻžāύ call-āĻ āĻāĻ•āϟāĻž frame āĻāχ lesson-āĻāϰ āϏāĻŦ āĻ āĻŋāĻ•āĻžāύāĻž āĻāĻ–āĻžāύ⧇ āύāϤ⧁āύ frame āĻŦāϏ⧇ āφāϰāĻ“ āύāĻŋāĻšā§‡: stack āύāĻŋāĻšā§‡āϰ āĻĻāĻŋāϕ⧇ āĻŦāĻžāĻĄāĻŧ⧇ āϚāϞāĻžāϰ āϏāĻŽāϝāĻŧ āĻšā§‡āϝāĻŧ⧇ āύ⧇āĻ“āϝāĻŧāĻž memory global āφāϰ static local, āĻĒ⧁āϰ⧋ run program-āĻāϰ instruction-āϗ⧁āϞ⧋

Code āĻšāϞ⧋ āϤ⧋āĻŽāĻžāϰ program-āĻāϰ instruction-āϗ⧁āϞ⧋āĨ¤ Static area-āϤ⧇ āĻĨāĻžāϕ⧇ global āφāϰ static local, āĻĒ⧁āϰ⧋ run āϜ⧁āĻĄāĻŧ⧇ (Module 7 lesson 5)āĨ¤ Stack-āĻ āĻĒā§āϰāϤāĻŋāϟāĻž āϚāϞāĻŽāĻžāύ call-āĻāϰ āĻāĻ•āϟāĻž āĻ•āϰ⧇ frame āĻĨāĻžāϕ⧇, āφāϰ āϤāĻžāϤ⧇ āĻĨāĻžāϕ⧇ āϏ⧇āχ call-āĻāϰ parameter āφāϰ localāĨ¤

Module 8 āύāϤ⧁āύ frame-āϟāĻž āĻāρāϕ⧇āĻ›āĻŋāϞ āĻ¸ā§āϤ⧂āĻĒ⧇āϰ āϏāĻŦāĻžāϰ āωāĻĒāϰ⧇āĨ¤ āĻ āĻŋāĻ•āĻžāύāĻžāϰ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏ⧇āϟāĻž āĻŦāϏ⧇ āύāĻŋāĻšā§‡, āĻ•āĻžāϰāĻŖ stack memory-āϤ⧇ āύāĻŋāĻšā§‡āϰ āĻĻāĻŋāϕ⧇ āĻŦāĻžāĻĄāĻŧ⧇ (Module 8 lesson 02)āĨ¤ āφāϰ heap, āĻŽāĻžāύ⧇ program āϚāϞāĻžāϰ āϏāĻŽāϝāĻŧ āĻšā§‡āϝāĻŧ⧇ āύ⧇āĻ“āϝāĻŧāĻž memory, āϏ⧇āϟāĻž Module 14-āĻāϰ āĻŦāĻŋāώāϝāĻŧāĨ¤

āĻāχ lesson-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž āĻļ⧁āϰ⧁ āĻšāϝāĻŧ 0x7ff āĻĻāĻŋāϝāĻŧ⧇, āĻ•āĻžāϰāĻŖ a, b, d āφāϰ marks āϏāĻŦāĻžāχ main-āĻāϰ local, āφāϰ Linux stack āϰāĻžāϖ⧇ āĻ“āĻ–āĻžāύ⧇āχāĨ¤ -O2-āĻ GCC āĻ…āύ⧇āĻ• local-āϕ⧇ register-āĻ āϰ⧇āϖ⧇ āĻĻ⧇āϝāĻŧ (Module 7 lesson 5)āĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āϝ⧇ āĻ āĻŋāĻ•āĻžāύāĻž print āĻšāϝāĻŧ, āϏ⧇āϟāĻžāϕ⧇ āĻāĻ•āϟāĻž āϏāĻ¤ā§āϝāĻŋāĻ•āĻžāϰ⧇āϰ āĻŦāĻžāĻ•ā§āϏ⧇āχ āύāĻŋāϝāĻŧ⧇ āϝ⧇āϤ⧇ āĻšāϝāĻŧāĨ¤

āϤāĻžāχ āĻāĻ•āϟāĻž local āĻĨāĻžāϕ⧇ stack-āĻ, āϤāĻžāϰ call-āĻāϰ frame-āĻ, āφāϰ āĻāĻ•āϟāĻž global āĻŦāĻž static āĻĨāĻžāϕ⧇ static area-āϤ⧇āĨ¤

Pointer āĻšāϞ⧋ āĻāĻŽāύ variable, āϝ⧇āϟāĻž āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž āϧāϰ⧇ āϰāĻžāϖ⧇

āĻ āĻŋāĻ•āĻžāύāĻž āϤ⧋ āĻāĻ•āϟāĻž āϏāĻ‚āĻ–ā§āϝāĻž, āϤāĻžāχ āĻāĻ•āϟāĻž variable āϏ⧇āϟāĻž āϧāϰ⧇ āϰāĻžāĻ–āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϝ⧇ variable āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž āϧāϰ⧇ āϰāĻžāϖ⧇, āϤāĻžāϰ āύāĻžāĻŽ pointerāĨ¤ āϏ⧇āϟāĻž āϝāĻĻāĻŋ &score āϧāϰ⧇ āϰāĻžāϖ⧇, āϤāĻžāĻšāϞ⧇ āĻŦāϞāĻž āĻšāϝāĻŧ āϏ⧇āϟāĻž score-āϕ⧇ point āĻ•āϰ⧇āĨ¤

āĻ āĻŋāĻ•āĻžāύāĻžāϰāĻ“ type āφāϛ⧇āĨ¤ int score-āĻāϰ āĻŦ⧇āϞāĻžāϝāĻŧ &score-āĻāϰ type āĻšāϞ⧋ int *, āĻĒāĻĄāĻŧā§‹ "pointer to int"āĨ¤ āĻāĻŽāύ type-āϕ⧇ āĻŦāϞ⧇ pointer typeāĨ¤ āϤāĻžāχ Module 9-āĻ GCC-āϰ 'int *', āφāϰ Module 10-āĻ string.h-āĻāϰ char *, āĻāϰāĻž āφāϏāϞ⧇ āϏāĻŦāϏāĻŽāϝāĻŧāχ āĻ āĻŋāĻ•āĻžāύāĻž āĻ›āĻŋāϞāĨ¤

Pointer declare āĻ•āϰāĻž, āφāϰ āϤāĻžāϰ āĻ­āĻŋāϤāϰ āĻĻāĻŋāϝāĻŧ⧇ āĻĒāĻĄāĻŧāĻž āφāϰ āϞ⧇āĻ–āĻž, lesson 02-āĻāϰ āĻ•āĻžāϜāĨ¤ āφāĻĒāĻžāϤāϤ āĻļ⧁āϧ⧁ āĻ—āĻĄāĻŧāύāϟāĻž āĻĻ⧇āϖ⧇ āϰāĻžāĻ–ā§‹: int *where = &score; āĻāĻ•āϟāĻž pointer āĻŦāĻžāύāĻžāϝāĻŧ, āύāĻžāĻŽ where, āϝ⧇āϟāĻž āϧāϰ⧇ āϰāĻžāϖ⧇ score-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžāĨ¤

āϤāĻžāχ &score āĻšāϞ⧋ int * type-āĻāϰ āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž, āφāϰ pointer āϏ⧇āϟāĻž āϧāϰ⧇ āϰāĻžāϖ⧇āĨ¤

scanf-āĻāϰ āϕ⧇āύ ampersand āϞāĻžāϗ⧇

āĻāĻŦāĻžāϰ Maria-āϰ āĻĒā§āϰāĻļā§āύāĨ¤ āĻāĻ•āϟāĻž call āĻĒā§āϰāϤāĻŋāϟāĻž argument-āĻāϰ āĻŽāĻžāύ āĻ•āĻĒāĻŋ āĻ•āϰ⧇ āύ⧇āϝāĻŧ (Module 7 lesson 3), āφāϰ āĻ•āĻĒāĻŋāϤ⧇ āϞāĻŋāĻ–āϞ⧇ āφāϏāϞāϟāĻžāϰ āĻ•āĻŋāϛ⧁āχ āĻŦāĻĻāϞāĻžāϝāĻŧ āύāĻžāĨ¤ scanf-āϕ⧇ āϞāĻŋāĻ–āϤ⧇ āĻšāϝāĻŧ āϤ⧋āĻŽāĻžāϰ variable-āĻāϰ āĻ­āĻŋāϤāϰ⧇, āϤāĻžāχ āĻ“āϰ āϜāĻžāύāĻž āĻĻāϰāĻ•āĻžāϰ variable-āϟāĻž āĻĨāĻžāϕ⧇ āϕ⧋āĻĨāĻžāϝāĻŧāĨ¤ &age āĻ“āϕ⧇ āĻ āĻŋāĻ• āϏ⧇āϟāĻžāχ āĻŦāϞ⧇ āĻĻ⧇āϝāĻŧāĨ¤

#include <stdio.h>

void set_to_31(int n);

int main(void)
{
    int age = 0;

    set_to_31(age);
    printf("after set_to_31: age = %d\n", age);
    scanf("%d", &age);
    printf("after scanf:     age = %d\n", age);
    return 0;
}

void set_to_31(int n)
{
    n = 31;
    printf("inside set_to_31: n = %d\n", n);
}

Input 27 āĻĻāĻŋāϝāĻŧ⧇ āĻāϟāĻž trace āĻ•āϰ⧋, age-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻž āĻŦāĻžāύāĻžāύ⧋ āĻ āĻŋāĻ•āĻžāύāĻž āϧāϰ⧇ āύāĻŋāϝāĻŧ⧇āĨ¤

āĻŽā§āĻšā§‚āĻ°ā§āϤCall āϕ⧀ āĻĒ⧇āϝāĻŧ⧇āϛ⧇age, 1000-āĻn, set_to_31-āĻāϰ frame-āĻ
āϕ⧋āύ⧋ call-āĻāϰ āφāϗ⧇0āĻāĻ–āύ⧋ āύ⧇āχ
set_to_31-āĻāϰ āĻ­āĻŋāϤāϰ⧇, n = 31-āĻāϰ āĻĒāϰ⧇āĻŽāĻžāύ 0, āĻāĻ•āϟāĻž āĻ•āĻĒāĻŋ031
set_to_31 return āĻ•āϰāĻžāϰ āĻĒāϰ⧇0frame-āĻāϰ āϏāĻžāĻĨ⧇ āĻšāĻžāϰāĻŋāϝāĻŧ⧇ āϗ⧇āϛ⧇
scanf 27 āĻĒāĻĄāĻŧāĻžāϰ āĻĒāϰ⧇1000, āĻŽāĻžāύ⧇ age-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž27
inside set_to_31: n = 31
after set_to_31: age = 0
after scanf:     age = 27

āĻ“āχ output-āϟāĻž input 27-āĻāϰ āϜāĻ¨ā§āϝāĨ¤ set_to_31 āĻŦāĻĻāϞ⧇āϛ⧇ āĻļ⧁āϧ⧁ āύāĻŋāĻœā§‡āϰ āĻ•āĻĒāĻŋāϟāĻžāĨ¤ scanf āĻĒ⧇āϝāĻŧ⧇āϛ⧇ age-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž, āφāϰ āϏ⧇āĻ–āĻžāύāĻ•āĻžāϰ āĻŦāĻžāĻ•ā§āϏ⧇ āϞāĻŋāϖ⧇ āĻĻāĻŋāϝāĻŧ⧇āϛ⧇ 27āĨ¤ āĻāϤ⧇ Module 7 lesson 3-āĻāϰ teaser-āĻāϰ āωāĻ¤ā§āϤāϰāĻ“ āĻŽāĻŋāϞ⧇ āϗ⧇āϞ: scanf āĻŦāϰāĻžāĻŦāϰāχ āϤ⧋āĻŽāĻžāϰ variable āĻŦāĻĻāϞ⧇āϛ⧇ āϤāĻžāĻĻ⧇āϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻĻāĻŋāϝāĻŧ⧇āĨ¤ āĻāĻŽāύ function āύāĻŋāĻœā§‡ āϕ⧀āĻ­āĻžāĻŦ⧇ āϞāĻŋāĻ–āĻŦ⧇, āϏ⧇āϟāĻž āĻĻ⧇āĻ–āĻžāĻŦ⧇ lesson 04āĨ¤

Module 3 lesson 4 āĻāĻ•āϟāĻž āĻŦā§āϝāϤāĻŋāĻ•ā§āϰāĻŽā§‡āϰ āĻ•āĻĨāĻž āĻŦāϞ⧇āĻ›āĻŋāϞ: scanf("%19s", word)-āĻ āϕ⧋āύ⧋ ampersand āύ⧇āχāĨ¤ Module 9 lesson 05 āĻŦāϞ⧇āĻ›āĻŋāϞ, āĻāĻ•āϟāĻž function-āϕ⧇ array āĻĻāĻŋāϞ⧇ āϏ⧇ āĻĒāĻžāϝāĻŧ āĻŦāĻžāĻ•ā§āϏāϗ⧁āϞ⧋ āϕ⧋āĻĨāĻžāϝāĻŧ āφāϛ⧇, āϏ⧇āχ āĻ–āĻŦāϰāĨ¤ āĻāχ āĻŽāĻžāύāϟāĻžāϰ āĻāĻŦāĻžāϰ āĻāĻ•āϟāĻž āύāĻžāĻŽ āĻšāϞ⧋: āĻŦāĻžāĻ•ā§āϏ 0-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžāĨ¤ āύāĻŋāĻšā§‡āϰ program āϏ⧇āϟāĻž āϤāĻŋāύāĻ­āĻžāĻŦ⧇ print āĻ•āϰ⧇āĨ¤

#include <stdio.h>

#define BOXES 3

void show_where(int a[], int n);

int main(void)
{
    int marks[BOXES] = {40, 55, 72};

    printf("main:       marks     = %p\n", (void *)marks);
    printf("main:       &marks[0] = %p\n", (void *)&marks[0]);
    show_where(marks, BOXES);
    return 0;
}

void show_where(int a[], int n)
{
    printf("show_where: a         = %p, n = %d\n", (void *)a, n);
}

āĻŦāĻžāύāĻžāύ⧋ āĻ āĻŋāĻ•āĻžāύāĻž āĻĻāĻŋāϝāĻŧ⧇ trace āĻ•āϰ⧋āĨ¤ show_where-āĻāϰ frame āĻŦāϏ⧇ main-āĻāϰ frame-āĻāϰ āύāĻŋāĻšā§‡āĨ¤

āύāĻžāĻŽāϕ⧋āĻĨāĻžāϝāĻŧ āĻĨāĻžāϕ⧇āĻŦāĻžāύāĻžāύ⧋ āĻ āĻŋāĻ•āĻžāύāĻžāϕ⧀ āϧāϰ⧇ āϰāĻžāϖ⧇
marks[0]main-āĻāϰ frame100040
marks[1]main-āĻāϰ frame100455
marks[2]main-āĻāϰ frame100872
ashow_where-āĻāϰ frame9601000, āĻŽāĻžāύ⧇ marks[0]-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž
nshow_where-āĻāϰ frame9683, āĻāĻ•āϟāĻž āĻ•āĻĒāĻŋ

Compiler Explorer-āĻ āĻāĻ•āĻŦāĻžāϰ run āĻ•āϰ⧇ āϤāĻŋāύāϟāĻž āϞāĻžāχāύ⧇āχ āĻāĻ•āχ āĻ āĻŋāĻ•āĻžāύāĻž print āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āϤ⧋āĻŽāĻžāϰ āϏāĻ‚āĻ–ā§āϝāĻž āφāϞāĻžāĻĻāĻž āĻšāĻŦ⧇, āϤāĻŦ⧇ āϤ⧋āĻŽāĻžāϰ āϤāĻŋāύāϟāĻž āϞāĻžāχāύāĻ“ āĻāϕ⧇ āĻ…āĻ¨ā§āϝ⧇āϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāϞāĻŦ⧇āĨ¤ Parameter a āϧāϰ⧇ āϰāĻžāϖ⧇ marks[0]-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž, āφāϰ āĻāĻ­āĻžāĻŦ⧇āχ Module 9-āĻāϰ function-āϗ⧁āϞ⧋ main-āĻāϰ āĻŦāĻžāĻ•ā§āϏ⧇ āĻĒ⧌āρāĻ›āĻžāϤāĨ¤

āϤāĻžāχ ampersand-āĻāϰ āύāĻŋāϝāĻŧāĻŽ āĻ•āĻ–āύ⧋ āĻ­āĻžāϙ⧇āύāĻŋ: & āϜāĻŋāĻœā§āĻžā§‡āϏ āĻ•āϰ⧇ āĻāĻ•āϟāĻž āĻŦāĻžāĻ•ā§āϏ āϕ⧋āĻĨāĻžāϝāĻŧ āĻĨāĻžāϕ⧇, āφāϰ array-āϰ āύāĻžāĻŽ āύāĻŋāĻœā§‡āχ āϏ⧇āϟāĻž āĻŦāϞ⧇ āĻĻ⧇āϝāĻŧāĨ¤ Module 3-āĻāϰ scanf("%d", roll) āĻšāĻžāϤ⧇ āĻĻāĻŋāϝāĻŧ⧇āĻ›āĻŋāϞ roll-āĻāϰ āĻ­āĻŋāϤāϰ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻžāϟāĻž, āφāϰ scanf āϏ⧇āϟāĻžāϕ⧇āχ āĻ āĻŋāĻ•āĻžāύāĻž āϭ⧇āĻŦ⧇ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤

Example 1: āĻĒā§āϰāϤāĻŋāϟāĻž āĻŦāĻžāĻ•ā§āϏ āĻ•āϤ byte āύ⧇āϝāĻŧ

Memory āύāĻŋāϝāĻŧ⧇ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϛ⧋āϟ program: āϚāĻžāϰāϟāĻž variable āφāϰ āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻžāϰ sizeofāĨ¤

#include <stdio.h>

#define BOXES 4

int main(void)
{
    int score = 87;
    double price = 7.5;
    char grade = 'B';
    int marks[BOXES] = {70, 80, 90, 60};

    printf("what      bytes\n");
    printf("score     %5zu\n", sizeof score);
    printf("price     %5zu\n", sizeof price);
    printf("grade     %5zu\n", sizeof grade);
    printf("marks     %5zu\n", sizeof marks);
    printf("&score    %5zu\n", sizeof &score);
    return 0;
}
what      bytes
score         4
price         8
grade         1
marks        16
&score        8

marks āĻšāϞ⧋ 4 byte-āĻāϰ āϚāĻžāϰāϟāĻž āĻŦāĻžāĻ•ā§āϏ, āϤāĻžāχ 16āĨ¤ āĻļ⧇āώ āϏāĻžāϰāĻŋāϟāĻž āύāϤ⧁āύ: sizeof &score āĻšāϞ⧋ āĻ āĻŋāĻ•āĻžāύāĻžāϟāĻžāϰ āύāĻŋāĻœā§‡āϰ āĻŽāĻžāĻĒ, score-āĻāϰ āύāĻž, āφāϰ āĻŽāĻžāĻĒāĻž run-āϟāĻžāĻ“ āĻ āĻŋāĻ• āĻāχ 8-āχ print āĻ•āϰ⧇āĻ›āĻŋāϞāĨ¤

Run in Compiler
Example 2: āϕ⧋āύ āĻŦāĻžāĻ•ā§āϏ āϕ⧋āĻĨāĻžāϝāĻŧ āĻļ⧁āϰ⧁, Zara āφāϗ⧇āχ āĻŦāϞ⧇ āĻĻ⧇āϝāĻŧ

āϝāĻž āφāϗ⧇ āĻĨ⧇āϕ⧇ āĻ…āύ⧁āĻŽāĻžāύ āĻ•āϰ⧇āύāĻŋ, Zara āϏ⧇āϟāĻž āĻŦāĻŋāĻļā§āĻŦāĻžāϏ āĻ•āϰ⧇ āύāĻžāĨ¤ āϕ⧋āύ⧋ āĻ āĻŋāĻ•āĻžāύāĻž āĻĻ⧇āĻ–āĻžāϰ āφāϗ⧇āχ āĻ“ āĻšāĻŋāϏāĻžāĻŦ āĻ•āϰ⧇ āĻĢ⧇āϞ⧇ āĻĒā§āϰāϤāĻŋāϟāĻž āĻŦāĻžāĻ•ā§āϏ āϕ⧋āĻĨāĻžāϝāĻŧ āĻļ⧁āϰ⧁ āĻšāĻ“āϝāĻŧāĻžāϰ āĻ•āĻĨāĻž, āĻļ⧁āϧ⧁ sizeof āĻĻāĻŋāϝāĻŧ⧇āĨ¤

#include <stdio.h>

#define MARKS 4
#define PRICES 3

int main(void)
{
    int marks[MARKS] = {70, 80, 90, 60};
    double prices[PRICES] = {1.5, 2.5, 3.5};

    for (int i = 0; i < MARKS; i++) {
        printf("marks[%d]  starts %2zu bytes after marks[0]\n", i, i * sizeof marks[0]);
    }
    for (int i = 0; i < PRICES; i++) {
        printf("prices[%d] starts %2zu bytes after prices[0]\n", i, i * sizeof prices[0]);
    }
    return 0;
}
marks[0]  starts  0 bytes after marks[0]
marks[1]  starts  4 bytes after marks[0]
marks[2]  starts  8 bytes after marks[0]
marks[3]  starts 12 bytes after marks[0]
prices[0] starts  0 bytes after prices[0]
prices[1] starts  8 bytes after prices[0]
prices[2] starts 16 bytes after prices[0]

āϗ⧁āĻŖāĻĢāϞāϟāĻž āĻāĻ•āϟāĻž size_t, āϤāĻžāχ print āĻšāϝāĻŧ %zu āĻĻāĻŋāϝāĻŧ⧇āĨ¤ āĻāĻŦāĻžāϰ run 1-āĻāϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāϞāĻŋāϝāĻŧ⧇ āĻĻ⧇āĻ–ā§‹: marks-āĻāϰ āĻŦāĻžāĻ•ā§āϏāϗ⧁āϞ⧋āϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻļ⧇āώ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ bd0, bd4, bd8 āφāϰ bdc-āĻāĨ¤ āĻŽāĻžāύ⧇ 0, 4, 8 āφāϰ 12 byte āĻĒāϰ⧇āĨ¤ āϝ⧇ āĻ…āύ⧁āĻŽāĻžāύ āĻĒā§āϰāϤāĻŋāϟāĻž run-āĻ āĻ–āĻžāĻŸā§‡, āϏ⧇āϟāĻž āϝ⧇āϕ⧋āύ⧋ āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻžāϰ āĻšā§‡āϝāĻŧ⧇ āĻŦ⧇āĻļāĻŋ āĻ•āĻžāĻœā§‡āϰāĨ¤

Run in Compiler
Example 3: Amara āĻāĻ•āϟāĻž class-āĻāϰ āϤāĻžāϞāĻŋāĻ•āĻž āĻĒāĻĄāĻŧ⧇

Amara āĻĒāĻĄāĻŧ⧇ āĻāĻ•āϜāύ āĻ›āĻžāĻ¤ā§āϰ⧇āϰ āύāĻžāĻŽ, āĻ•āϝāĻŧāϟāĻž āύāĻŽā§āĻŦāϰ āφāϏāĻŦ⧇ āϏ⧇āχ āϏāĻ‚āĻ–ā§āϝāĻž, āϤāĻžāϰāĻĒāϰ āϤāϤāϗ⧁āϞ⧋ āύāĻŽā§āĻŦāϰāĨ¤ āύāϤ⧁āύ āϕ⧇āω āĻ āĻŋāĻ• āĻāχ program-āϟāĻžāχ āϞ⧇āϖ⧇, āφāϰ āĻāϤ⧇ scanf āϤāĻŋāύ āϰāĻ•āĻŽ āϜāĻžāϝāĻŧāĻ—āĻžāϝāĻŧ āϞ⧇āϖ⧇āĨ¤

#include <stdio.h>

#define MAX_N 50

int main(void)
{
    char name[20] = {0};
    int n = 0;
    int marks[MAX_N] = {0};
    int total = 0;

    scanf("%19s", name);
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &marks[i]);
        total += marks[i];
    }

    printf("%s: %d marks, total %d\n", name, n, total);
    printf("first %d, last %d\n", marks[0], marks[n - 1]);
    return 0;
}
āϝ⧇āϟāĻž āĻĒāĻĄāĻŧāĻž āĻšāϝāĻŧscanf āϕ⧀ āĻĒāĻžāϝāĻŧāϕ⧇āύ
namename[0]-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžarray-āϰ āĻ–āĻžāϞāĻŋ āύāĻžāĻŽ āύāĻŋāĻœā§‡āχ āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž
&nn-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžāĻāĻ•āϟāĻž variable-āĻāϰ ampersand āϞāĻžāϗ⧇
&marks[i]āĻŦāĻžāĻ•ā§āϏ i-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž, āĻŦāĻžāĻ•ā§āϏ 0-āĻāϰ 4 x i byte āĻĒāϰ⧇int array-āϰ āĻāĻ• āĻŦāĻžāĻ•ā§āϏ āĻŽāĻžāύ⧇ āĻāĻ•āϟāĻž int
Amara: 5 marks, total 356
first 70, last 48

āĻ“āχ output-āϟāĻž input Amara, 5 āφāϰ 70 85 62 91 48-āĻāϰ āϜāĻ¨ā§āϝāĨ¤ āĻāĻ•āϟāĻž variable-āĻāϰ ampersand āϞāĻžāϗ⧇, āĻāĻ• āĻŦāĻžāĻ•ā§āϏ⧇āϰāĻ“ āϞāĻžāϗ⧇, āφāϰ array-āϰ āĻ–āĻžāϞāĻŋ āύāĻžāĻŽā§‡āϰ āĻ•āĻ–āύ⧋ āϞāĻžāϗ⧇ āύāĻžāĨ¤

Run in Compiler

āĻāϟāĻž āϕ⧋āĻĨāĻžāϝāĻŧ āĻ•āĻžāĻœā§‡ āϞāĻžāϗ⧇

  • DebuggerāĨ¤ GDB, āĻŽāĻžāύ⧇ GNU debugger-āĻ print &score āĻāĻ•āϟāĻž variable-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻĻ⧇āĻ–āĻžāϝāĻŧ, āφāϰ x/4dw &marks āĻĻ⧇āĻ–āĻžāϝāĻŧ āϏ⧇āĻ–āĻžāύ āĻĨ⧇āϕ⧇ āϰāĻžāĻ–āĻž āϚāĻžāϰāϟāĻž intāĨ¤
  • Memory mapāĨ¤ Linux-āĻ /proc/self/maps āĻāĻ•āϟāĻž āϚāϞāĻŽāĻžāύ program-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž āĻāϞāĻžāĻ•āĻž, āϤāĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻžāϰ āϏ⧀āĻŽāĻžāϏāĻš, āϤāĻžāϞāĻŋāĻ•āĻž āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻžāϝāĻŧāĨ¤ Stack-āĻāϰ āϞāĻžāχāύ⧇āϰ āĻ—āĻžāϝāĻŧ⧇ āϞ⧇āĻ–āĻž āĻĨāĻžāϕ⧇ [stack]āĨ¤
  • āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻžāĨ¤ Linux, Windows āφāϰ macOS āϏāĻŦāĻžāχ ASLR āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āϤāĻžāχ āφāϗ⧇āϰ āϕ⧋āύ⧋ run āĻĨ⧇āϕ⧇ āϜāĻžāύāĻž āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āφāĻ•ā§āϰāĻŽāĻŖ āϤāĻžāĻ• āĻ•āϰāĻž āϝāĻžāϝāĻŧ āύāĻžāĨ¤ Linux-āĻ /proc/sys/kernel/randomize_va_space-āĻ 2 āĻĨāĻžāĻ•āϞ⧇ stack, library āφāϰ heap, āϏāĻŦāχ āϏāϰ⧇ āϝāĻžāϝāĻŧāĨ¤
  • Crash reportāĨ¤ āĻāĻ•āϟāĻž program āϝāĻ–āύ āĻāĻŽāύ memory āϛ⧋āρāϝāĻŧ, āϝ⧇āϟāĻž āϛ⧋āρāϝāĻŧāĻžāϰ āĻ…āϧāĻŋāĻ•āĻžāϰ āϤāĻžāϰ āύ⧇āχ, Linux āϤāĻžāϕ⧇ āĻĨāĻžāĻŽāĻŋāϝāĻŧ⧇ āĻĻ⧇āϝāĻŧāĨ¤ Kernel log, dmesg, āϤāĻ–āύ āϞāĻŋāϖ⧇ āϰāĻžāϖ⧇ segfault at āφāϰ āϛ⧋āρāϝāĻŧāĻž āĻ āĻŋāĻ•āĻžāύāĻžāϟāĻž, āϝ⧇āϟāĻž bug āĻ–ā§‹āρāϜāĻžāϰ āĻĒā§āϰāĻĨāĻŽ āϏ⧂āĻ¤ā§āϰāĨ¤

āϝ⧇ āϭ⧁āϞāϗ⧁āϞ⧋ āϏāĻŦāĻžāχ āĻ•āϰ⧇

ā§§. %d āĻĻāĻŋāϝāĻŧ⧇ āĻ āĻŋāĻ•āĻžāύāĻž print āĻ•āϰāĻžāĨ¤

int score = 87;

printf("%d\n", &score);

Playground-āĻ āϕ⧋āύ⧋ āĻŦāĻžāĻ°ā§āϤāĻž āύ⧇āχāĨ¤ GCC 12-āĻ local gcc -Wall āĻŦāϞ⧇ warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=]āĨ¤ āĻ āĻŋāĻ•āĻžāύāĻž 8 byte, āφāϰ %d āĻĒāĻĄāĻŧ⧇ āĻŽāĻžāĻ¤ā§āϰ 4 byteāĨ¤ Compiler Explorer-āĻ āĻāĻ•āĻŦāĻžāϰ run āĻ•āϰ⧇ print āĻšāϝāĻŧ⧇āϛ⧇ āĻĻāĻļ āĻ…āĻ™ā§āϕ⧇āϰ āĻāĻ•āϟāĻž negative āϏāĻ‚āĻ–ā§āϝāĻž: āĻ āĻŋāĻ•āĻžāύāĻžāϰ āĻļ⧇āώ⧇āϰ 4 byteāĨ¤ āϞ⧇āĻ–ā§‹ printf("%p\n", (void *)&score);āĨ¤ āϤ⧁āĻŽāĻŋ %d-āĻāϰ āĻĻāĻŋāϕ⧇ āĻšāĻžāϤ āĻŦāĻžāĻĄāĻŧāĻžāĻŦ⧇, āĻ•āĻžāϰāĻŖ āĻāϤāĻĻāĻŋāύ āϝāϤ āϏāĻ‚āĻ–ā§āϝāĻž āĻāϏ⧇āϛ⧇, āϏāĻŦāχ āĻ›āĻŋāϞ intāĨ¤

⧍. Cast āĻ›āĻžāĻĄāĻŧāĻž %pāĨ¤

printf("%p\n", &score);

āϕ⧋āύ⧋ command line-āĻāχ āϕ⧋āύ⧋ āĻŦāĻžāĻ°ā§āϤāĻž āύ⧇āχāĨ¤ Compiler Explorer-āĻ āĻāĻ•āĻŦāĻžāϰ run āĻ•āϰ⧇ cast āĻĻāĻŋāϝāĻŧ⧇ āφāϰ cast āĻ›āĻžāĻĄāĻŧāĻž āĻāĻ•āχ āϏāĻ‚āĻ–ā§āϝāĻž print āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āϤāĻŦ⧁ C17 āϚāĻžāϝāĻŧ āĻāĻ•āϟāĻž void * (section 7.21.6.1)āĨ¤ āĻļ⧁āϧ⧁ -Wpedantic, āĻŽāĻžāύ⧇ āφāϰāĻ“ āĻ•āĻĄāĻŧāĻž āĻāĻ•āϟāĻž switch, āĻŦāϞ⧇ warning: format '%p' expects argument of type 'void *', but argument 2 has type 'int *' [-Wformat=]āĨ¤ x86-64-āĻ āϏāĻŦ āĻ āĻŋāĻ•āĻžāύāĻžāϰ āĻ—āĻĄāĻŧāύ āĻāĻ•āχ, āϤāĻžāχ āĻāĻ–āĻžāύ⧇ āϚāϞ⧇ āϝāĻžāϝāĻŧ; cast āĻĨāĻžāĻ•āϞ⧇ āϏāĻŦ āϜāĻžāϝāĻŧāĻ—āĻžāϝāĻŧ āĻ āĻŋāĻ• āĻĨāĻžāϕ⧇āĨ¤ āϤ⧁āĻŽāĻŋ cast-āϟāĻž āĻŦāĻžāĻĻ āĻĻ⧇āĻŦ⧇, āĻ•āĻžāϰāĻŖ āϕ⧇āω āφāĻĒāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āύāĻžāĨ¤

ā§Š. āĻāĻ•āϟāĻž āϏāĻ‚āĻ–ā§āϝāĻž āĻŦāĻž āϝ⧋āĻ—āĻĢāϞ⧇āϰ āφāϗ⧇ ampersandāĨ¤

printf("%p\n", (void *)&60);
printf("%p\n", (void *)&(score + 1));

Playground-āϏāĻš āĻĒā§āϰāϤāĻŋāϟāĻž command line-āĻ error, āĻĒā§āϰāϤāĻŋāϟāĻž āϞāĻžāχāύ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āĻŦāĻžāϰ: error: lvalue required as unary '&' operandāĨ¤ Lvalue āĻšāϞ⧋ āĻāĻŽāύ expression, āϝ⧇āϟāĻž āĻāĻ•āϟāĻž āĻŦāĻžāĻ•ā§āϏ⧇āϰ āύāĻžāĻŽ, āĻŽāĻžāύ⧇ āϝ⧇āϟāĻž =-āĻāϰ āĻŦāĻžāρ āĻĒāĻžāĻļ⧇ āĻĻāĻžāρāĻĄāĻŧāĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ 60 āφāϰ score + 1 āϕ⧋āύ⧋ āĻŦāĻžāĻ•ā§āϏ⧇ āĻĨāĻžāϕ⧇ āύāĻž, āϤāĻžāχ āĻāĻĻ⧇āϰ āϕ⧋āύ⧋ āĻ āĻŋāĻ•āĻžāύāĻžāĻ“ āύ⧇āχāĨ¤ āĻŽāĻžāύāϟāĻž āφāϗ⧇ āĻāĻ•āϟāĻž variable-āĻ āϰāĻžāĻ–ā§‹, āϤāĻžāϰāĻĒāϰ āϏ⧇āχ variable-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž āύāĻžāĻ“āĨ¤ āϕ⧋āύ⧋ āĻšāĻŋāϏāĻžāĻŦ⧇āϰ āĻĢāϞ⧇āϰ āĻ āĻŋāĻ•āĻžāύāĻž āϚāĻžāχāϤ⧇ āĻ—āĻŋāϝāĻŧ⧇āχ āϤ⧁āĻŽāĻŋ āĻāϟāĻž āϞāĻŋāϖ⧇ āĻŦāϏāĻŦ⧇āĨ¤

ā§Ē. Array-āϰ āύāĻžāĻŽā§‡āϰ āφāϗ⧇ ampersandāĨ¤

char name[20] = {0};

scanf("%19s", &name);

Playground-āĻ āϕ⧋āύ⧋ āĻŦāĻžāĻ°ā§āϤāĻž āύ⧇āχāĨ¤ GCC 12-āĻ local gcc -Wall āĻŦāϞ⧇ warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[20]' [-Wformat=]āĨ¤ āύāĻžāĻŽāϟāĻž āϤāĻŦ⧁ āĻ āĻŋāĻ•āχ āĻĒāĻĄāĻŧāĻž āĻšāϝāĻŧ: Compiler Explorer-āĻ input Maria āĻĻāĻŋāϞ⧇ print āĻšāϝāĻŧ⧇āϛ⧇ hello, MariaāĨ¤ &name āĻāĻ•āχ āϏāĻ‚āĻ–ā§āϝāĻž, āĻļ⧁āϧ⧁ type āφāϞāĻžāĻĻāĻž, char (*)[20], āĻŽāĻžāύ⧇ āĻĒ⧁āϰ⧋ array-āϟāĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻžāĨ¤ āϞ⧇āĻ–ā§‹ scanf("%19s", name);āĨ¤ āĻ…āĻ­ā§āϝāĻžāϏ⧇āϰ āĻŦāĻļ⧇ āϤ⧁āĻŽāĻŋ ampersand-āϟāĻž āĻŦāϏāĻžāĻŦ⧇; array-āϰ āύāĻžāĻŽ āϕ⧇āύ āφāϞāĻžāĻĻāĻž, āϏ⧇āϟāĻž āĻĻ⧇āĻ–āĻžāĻŦ⧇ lesson 03āĨ¤

āĻŽāĻžāĻĨāĻž āĻ–āĻžāϟāĻžāĻ“

Playground-āĻāϰ run āĻĻ⧁āχāϟāĻž āφāĻŦāĻžāϰ āĻĻ⧇āĻ–ā§‹āĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž āĻŦāĻĻāϞ⧇āϛ⧇, āφāϰ āĻĒā§āϰāϤāĻŋāϟāĻž āĻĻā§‚āϰāĻ¤ā§āĻŦ āĻāĻ•āχ āφāϛ⧇āĨ¤

Kenji āĻŦāϞ⧇, system āύāĻŋāĻļā§āϚāϝāĻŧāχ āĻĒā§āϰāϤāĻŋāϟāĻž variable-āϕ⧇ āĻāĻ•āϟāĻž āύāϤ⧁āύ āĻāϞ⧋āĻŽā§‡āϞ⧋ āϜāĻžāϝāĻŧāĻ—āĻž āĻĻ⧇āϝāĻŧ, āϤāĻžāϰāĻĒāϰ āϖ⧁āĻŦ āϝāĻ¤ā§āύ āĻ•āϰ⧇ āφāϗ⧇āϰ āĻĢāĻžāρāĻ•āϗ⧁āϞ⧋ āĻŦāϜāĻžāϝāĻŧ āϰāĻžāϖ⧇āĨ¤ Maria āĻŦāϞ⧇, āĻŦā§āϝāĻžāĻĒāĻžāϰāϟāĻž āĻāϰ āĻšā§‡āϝāĻŧ⧇ āϏāĻšāϜāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž āϞāĻžāχāύ⧇ run 1-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻĨ⧇āϕ⧇ run 2-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻŦāĻŋāϝāĻŧā§‹āĻ— āĻ•āϰ⧋āĨ¤ āϕ⧀ āĻĒāĻžāĻ“, āφāϰ system āφāϏāϞ⧇ āϕ⧀ āϏāϰāĻŋāϝāĻŧ⧇āϛ⧇?

āĻāĻŦāĻžāϰ āĻ•āĻ āĻŋāύ āĻ…āĻ‚āĻļāĨ¤ āĻāĻ•āϟāĻž bug-āĻ“āϝāĻŧāĻžāϞāĻž program āĻļ⧁āϧ⧁ āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž, &a, āĻāĻŽāύ āϜāĻžāϝāĻŧāĻ—āĻžāϝāĻŧ print āĻ•āϰ⧇, āϝ⧇āĻ–āĻžāύ⧇ āϝ⧇ āϕ⧇āω āĻĒāĻĄāĻŧāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻ“āχ run-āĻāϰ āφāϰ āϕ⧋āύ āϕ⧋āύ āĻ āĻŋāĻ•āĻžāύāĻž āĻāĻ–āύ āϏ⧇ āĻšāĻŋāϏāĻžāĻŦ āĻ•āϰ⧇ āĻŦ⧇āϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇, āφāϰ āϤāĻžāϤ⧇ ASLR-āĻāϰ āϕ⧀ āĻšāϝāĻŧ?

āĻĒā§āϰāϤāĻŋāϟāĻž āĻ āĻŋāĻ•āĻžāύāĻžāϕ⧇ āϞ⧇āĻ–ā§‹ &a āϝ⧋āĻ— āĻļ⧇āώ āĻ•āϞāĻžāĻŽā§‡āϰ āĻĻā§‚āϰāĻ¤ā§āĻŦ āĻšāĻŋāϏ⧇āĻŦ⧇āĨ¤ āĻĻ⧁āχ run-āĻāϰ āĻŽāĻ§ā§āϝ⧇ āĻ“āχ āϝ⧋āĻ—āĻĢāϞ⧇āϰ āϕ⧋āύ āĻ…āĻ‚āĻļāϟāĻž āĻŦāĻĻāϞāĻžāϝāĻŧ?

āĻ…āύ⧁āĻļā§€āϞāύ ā§§āϏāĻšāϜ

Kenji āĻŦāϞ⧇, variable-āϗ⧁āϞ⧋ āϏāĻŦāϏāĻŽāϝāĻŧ āϝ⧇ āĻ•ā§āϰāĻŽā§‡ declare āĻ•āϰāĻž āĻšāϝāĻŧ, āϏ⧇āχ āĻ•ā§āϰāĻŽā§‡āχ āĻŦāϏ⧇āĨ¤ āύāĻŋāĻœā§‡āϰ āĻāĻ•āϟāĻž program-āĻ āϝāĻžāϚāĻžāχ āĻ•āϰ⧋: āϤāĻŋāύāϟāĻž variable āφāϰ āĻĒāĻžāρāϚ āĻŦāĻžāĻ•ā§āϏ⧇āϰ āĻāĻ•āϟāĻž arrayāĨ¤

Input. āύ⧇āχāĨ¤

Output. &seats = address-āĻāϰ āĻŽāϤ⧋ āφāϟāϟāĻž āϞāĻžāχāύ: seats, price, row, āϤāĻžāϰāĻĒāϰ stock-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž āĻŦāĻžāĻ•ā§āϏāĨ¤ āϤāĻžāϰāĻĒāϰ sizeof stock[0] āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻž āϞāĻžāχāύ, one box: N bytesāĨ¤

Constraints. āĻĒā§āϰāϤāĻŋāϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž print āĻ•āϰ⧋ %p āφāϰ (void *) cast āĻĻāĻŋāϝāĻŧ⧇āĨ¤ āĻŦāĻžāĻ•ā§āϏāϗ⧁āϞ⧋āϰ āĻŽāĻžāĻā§‡āϰ āϧāĻžāĻĒ āĻšā§‹āϖ⧇ āĻĻ⧇āϖ⧇ āĻĒāĻĄāĻŧā§‹, āĻļ⧇āώ⧇āϰ digit-āϗ⧁āϞ⧋ āĻĨ⧇āϕ⧇āĨ¤

Sample. āĻĻ⧁āχāϟāĻž run āĻ•āĻ–āύ⧋ āĻŽā§‡āϞ⧇ āύāĻžāĨ¤ Lesson-āĻāϰ āĻĒā§āϰāĻĨāĻŽ run āĻāĻ•āϟāĻž āϞāĻžāχāύ⧇āϰ āĻ—āĻĄāĻŧāύ āĻĻ⧇āĻ–āĻžāϝāĻŧ: &marks[0] = 0x7ffe8f424bd0āĨ¤ āϤ⧋āĻŽāĻžāϰ āϏāĻ‚āĻ–ā§āϝāĻž āϝāĻž-āχ āĻšā§‹āĻ•, āĻŦāĻžāĻ•ā§āϏāϗ⧁āϞ⧋āϰ āĻŽāĻžāĻā§‡āϰ āϧāĻžāĻĒ āϤ⧋āĻŽāĻžāϰ āĻļ⧇āώ āϞāĻžāχāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāϞāϤ⧇āχ āĻšāĻŦ⧇āĨ¤

#include <stdio.h>

#define BOXES 5

int main(void)
{
    int seats = 40;
    double price = 7.5;
    char row = 'C';
    int stock[BOXES] = {12, 0, 7, 3, 25};

    /* Print the address of seats, price and row, one per line.
       Then print the address of every box of stock, and
       sizeof stock[0]. Which step do you read between the boxes? */

    return 0;
}

āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ āĻ—ā§āϰ⧇āĻĄ āĻšāϝāĻŧ āύāĻžāĨ¤ āĻ āĻŋāĻ•āĻžāύāĻž āĻĒā§āϰāϤāĻŋ run-āĻ āĻŦāĻĻāϞāĻžāϝāĻŧ, āφāϰ judge āϞ⧇āĻ–āĻž āĻŽāĻŋāϞāĻŋāϝāĻŧ⧇ āĻĻ⧇āϖ⧇āĨ¤

Run in Compiler
āĻ…āύ⧁āĻļā§€āϞāύ ⧍āĻŽāĻžāĻāĻžāϰāĻŋ

Maria āĻāĻ•āϟāĻž āωāĻĻāĻžāĻšāϰāϪ⧇ āϖ⧁āĻļāĻŋ āύāĻž, āĻ“ āύāĻŋāϝāĻŧāĻŽāϟāĻž āϚāĻžāϝāĻŧ: āĻĻ⧁āχ āĻŦāĻžāĻ•ā§āϏ⧇āϰ āĻŽāĻžāĻā§‡āϰ āϧāĻžāĻĒ āĻ•āĻŋ āϏāĻŦāϏāĻŽāϝāĻŧ āĻāĻ• āĻŦāĻžāĻ•ā§āϏ⧇āϰ āĻŽāĻžāĻĒ⧇āϰ āϏāĻŽāĻžāύ? āĻĒāĻžāρāϚāϟāĻž type-āĻ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧋, āϝāĻžāϰ āĻāĻ•āϟāĻž āĻāχ lesson-āĻ āύāϤ⧁āύāĨ¤

Input. āύ⧇āχāĨ¤

Output. āĻĒā§āϰāϤāĻŋāϟāĻž array-āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻž āĻ•āϰ⧇, āĻŽā§‹āϟ āĻĒāĻžāρāϚ āϞāĻžāχāύ: type, āĻāĻ• āĻŦāĻžāĻ•ā§āϏ⧇āϰ sizeof, āφāϰ āĻŦāĻžāĻ•ā§āϏ 0 āĻ“ āĻŦāĻžāĻ•ā§āϏ 1-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžāĨ¤

Constraints. āĻŽāĻžāĻĒ print āĻ•āϰ⧋ %zu āĻĻāĻŋāϝāĻŧ⧇, āĻ āĻŋāĻ•āĻžāύāĻž %p āφāϰ (void *) āĻĻāĻŋāϝāĻŧ⧇āĨ¤ āϚāĻžāϞāĻžāύ⧋āϰ āφāϗ⧇ āĻĒā§āϰāϤāĻŋāϟāĻž type-āĻ āĻ•āϤ āϧāĻžāĻĒ āφāĻļāĻž āĻ•āϰāĻ›, āĻāĻ•āϟāĻž comment-āĻ āϞāĻŋāϖ⧇ āϰāĻžāĻ–ā§‹āĨ¤

Sample. āĻ āĻŋāĻ•āĻžāύāĻž āĻĒā§āϰāϤāĻŋ run-āĻ āφāϞāĻžāĻĻāĻžāĨ¤ int-āĻāϰ āĻŦ⧇āϞāĻžāϝāĻŧ āĻŽāĻžāĻĒāĻž run-āĻ āĻŦāĻžāĻ•ā§āϏ 0 āĻ›āĻŋāϞ 0x7ffd8d6d3850-āĻ āφāϰ āĻŦāĻžāĻ•ā§āϏ 1 āĻ›āĻŋāϞ 0x7ffd8d6d3854-āĻ, āϧāĻžāĻĒ 4āĨ¤ āϤ⧋āĻŽāĻžāϰ short-āĻāϰ āϞāĻžāχāύāϟāĻž āĻāĻ–āĻžāύāĻ•āĻžāϰ āϕ⧋āύ⧋ table-āĻ āύ⧇āχāĨ¤

#include <stdio.h>

int main(void)
{
    char letters[2] = {'a', 'b'};
    short years[2] = {2025, 2026};
    int seats[2] = {40, 42};
    long long views[2] = {1000000000000, 2000000000000};
    double prices[2] = {7.5, 9.25};

    /* For each array, print on one line: the type, sizeof one box,
       and the addresses of box 0 and box 1. Before you run it,
       write the step you expect for each type in a comment. */

    return 0;
}

āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ āĻ—ā§āϰ⧇āĻĄ āĻšāϝāĻŧ āύāĻž, āĻāĻ•āχ āĻ•āĻžāϰāϪ⧇: āĻ āĻŋāĻ•āĻžāύāĻž āĻĒā§āϰāϤāĻŋ run-āĻ āĻŦāĻĻāϞāĻžāϝāĻŧ, āφāϰ judge āϞ⧇āĻ–āĻž āĻŽāĻŋāϞāĻŋāϝāĻŧ⧇ āĻĻ⧇āϖ⧇āĨ¤

Run in Compiler

āϏāϚāϰāĻžāϚāϰ āϝ⧇ āĻĒā§āϰāĻļā§āύāϗ⧁āϞ⧋ āφāϏ⧇

  • āϏāĻŦ āĻ āĻŋāĻ•āĻžāύāĻž 0x7ff āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āϕ⧇āύ, āφāϰ āĻŽāĻžāĻ¤ā§āϰ 12āϟāĻž digit āϕ⧇āύ?

    āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž 8 byte, āϤāĻžāϤ⧇ 16āϟāĻž hexadecimal digit-āĻāϰ āϜāĻžāϝāĻŧāĻ—āĻž āφāϛ⧇āĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ x86-64-āĻāϰ Linux āĻāĻ•āϟāĻž program-āϕ⧇ āĻĻ⧇āϝāĻŧ āĻļ⧁āϧ⧁ 0x7fffffffffff āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϏāĻ‚āĻ–ā§āϝāĻžāϗ⧁āϞ⧋, āĻŽāĻžāύ⧇ āĻŦāĻžāϰ⧋ digitāĨ¤ āĻāϰ āωāĻĒāϰ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻžāϗ⧁āϞ⧋ operating system-āĻāϰ āύāĻŋāĻœā§‡āϰāĨ¤ Stack āĻŦāϏ⧇ āĻ āĻŋāĻ• āĻāχ āϏ⧀āĻŽāĻžāϰ āύāĻŋāĻšā§‡, āϤāĻžāχ āϤāĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻļ⧁āϰ⧁ āĻšāϝāĻŧ 0x7ff āĻĻāĻŋāϝāĻŧ⧇āĨ¤

  • Program āϚāϞāĻžāϰ āĻŽāĻžāĻā§‡ āĻ•āĻŋ āĻāĻ•āϟāĻž variable-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻŦāĻĻāϞāĻžāϝāĻŧ?

    āύāĻžāĨ¤ āĻāĻ•āϟāĻž variable āϏāĻžāϰāĻž āĻœā§€āĻŦāύ āĻāĻ•āϟāĻžāχ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āĻĨāĻžāϕ⧇āĨ¤ Global āĻŦāĻž static āĻŦāĻžāρāĻšā§‡ āĻĒ⧁āϰ⧋ run, āϤāĻžāχ āϏ⧇āχ run-āĻ āϤāĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻ¸ā§āĻĨāĻŋāϰāĨ¤ āĻāĻ•āϟāĻž local āĻŦāĻžāρāĻšā§‡ āĻāĻ• call, āφāϰ āĻĒāϰ⧇āϰ call āϤāĻžāϕ⧇ āĻ…āĻ¨ā§āϝ āϕ⧋āĻĨāĻžāĻ“ āĻŦāϏāĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

  • āφāĻŽāĻŋ āĻ•āĻŋ āύāĻŋāĻœā§‡ āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž āĻŦ⧇āϛ⧇ āύāĻŋāϝāĻŧ⧇, āϧāϰ⧋ 1000, āϏ⧇āĻ–āĻžāύ⧇ āϞāĻŋāĻ–āϤ⧇ āĻĒāĻžāϰāĻŋ?

    Variable-āĻāϰ āϜāĻ¨ā§āϝ āύāĻž: āĻ“āĻĻ⧇āϰ āĻŦāϏāĻžāϝāĻŧ compiler āφāϰ systemāĨ¤ āϕ⧇āω āĻĻ⧇āϝāĻŧāύāĻŋ āĻāĻŽāύ āĻ āĻŋāĻ•āĻžāύāĻž āĻĻāĻŋāϝāĻŧ⧇ āϞ⧇āĻ–āĻž āĻŽāĻžāύ⧇ wild pointer, lesson 07-āĻāϰ āĻŦāĻŋāώāϝāĻŧāĨ¤ Playground-āĻ Bob-āĻāϰ āĻŽāĻžāĻĒāĻž āĻšā§‡āĻˇā§āϟāĻžāϟāĻž āĻļ⧇āώ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ Runtime error-āĻ; āĻŦāĻžāĻ‚āϞāĻž page-āĻ āĻāχ badge āĻŦāĻžāĻ‚āϞāĻžāϝāĻŧ āĻĻ⧇āĻ–āĻžāϝāĻŧāĨ¤

  • Kenji-āϰ laptop āĻ āĻŋāĻ•āĻžāύāĻž āĻ…āĻ¨ā§āϝāĻ­āĻžāĻŦ⧇ print āĻ•āϰ⧇āĨ¤ āĻ“āϟāĻž āĻ•āĻŋ āύāĻˇā§āϟ?

    āύāĻž, āĻ“āϰ laptop-āĻāĻ“ āϏāĻŦ āĻ āĻŋāĻ•āĻ āĻžāĻ• āϚāϞāϛ⧇āĨ¤ %p āĻĻ⧇āĻ–āϤ⧇ āϕ⧇āĻŽāύ āĻšāĻŦ⧇, C17 āϏ⧇āϟāĻž āĻĒā§āϰāϤāĻŋāϟāĻž system-āĻāϰ āωāĻĒāϰ āϛ⧇āĻĄāĻŧ⧇ āĻĻāĻŋāϝāĻŧ⧇āϛ⧇ (section 7.21.6.1)āĨ¤ Playground-āĻāϰ GNU C Library āϞ⧇āϖ⧇ 0x āφāϰ āϛ⧋āϟ āĻšāĻžāϤ⧇āϰ āĻ…āĻ•ā§āώāϰāĨ¤ Windows-āĻ Microsoft-āĻāϰ C library āϞ⧇āϖ⧇ āĻŦāĻĄāĻŧ āĻšāĻžāϤ⧇āϰ 16āϟāĻž digit, āϏāĻžāĻŽāύ⧇ āϕ⧋āύ⧋ 0x āĻ›āĻžāĻĄāĻŧāĻžāĨ¤

āĻŽā§‚āϞ āĻ•āĻĨāĻž

  • Memory āĻšāϞ⧋ āύāĻŽā§āĻŦāϰ āĻĻ⧇āĻ“āϝāĻŧāĻž byte-āĻāϰ āϏāĻžāϰāĻŋāĨ¤ āĻāĻ•āϟāĻž variable-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž āϤāĻžāϰ āĻĒā§āϰāĻĨāĻŽ byte-āĻāϰ āύāĻŽā§āĻŦāϰ, āφāϰ &x āϏ⧇āϟāĻž āĻāύ⧇ āĻĻ⧇āϝāĻŧāĨ¤
  • āĻ āĻŋāĻ•āĻžāύāĻž print āĻ•āϰ⧋ %p āφāϰ (void *) cast āĻĻāĻŋāϝāĻŧ⧇: %p āϚāĻžāϝāĻŧ void *, āĻŽāĻžāύ⧇ āϏāĻžāϧāĻžāϰāĻŖ āĻ āĻŋāĻ•āĻžāύāĻžāϰ typeāĨ¤
  • ASLR-āĻāϰ āĻ•āĻžāϰāϪ⧇ āĻ āĻŋāĻ•āĻžāύāĻž āĻĒā§āϰāϤāĻŋ run-āĻ āĻŦāĻĻāϞāĻžāϝāĻŧ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāĻ•āχ run-āĻāϰ āĻ­āĻŋāϤāϰ⧇āϰ āĻĻā§‚āϰāĻ¤ā§āĻŦ āĻŦāĻĻāϞāĻžāϝāĻŧ āύāĻžāĨ¤ āϤāĻžāχ āĻ āĻŋāĻ•āĻžāύāĻž āĻŽā§‡āϞāĻžāĻ“ āĻāĻ•āχ run-āĻāϰ āĻ­āĻŋāϤāϰ⧇āĨ¤
  • Array-āϰ āĻŦāĻžāĻ•ā§āϏāϗ⧁āϞ⧋ āĻŦāϏ⧇ āĻāĻ• āĻŦāĻžāĻ•ā§āϏ⧇āϰ sizeof āĻĒāϰāĻĒāϰ: int-āĻ 4, char-āĻ 1, double-āĻ 8āĨ¤ āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻž āύāĻŋāĻœā§‡ āύ⧇āϝāĻŧ 8 byteāĨ¤
  • Local āĻĨāĻžāϕ⧇ stack-āĻ, āϤāĻžāϰ call-āĻāϰ frame-āĻ; global āφāϰ static āĻĨāĻžāϕ⧇ static area-āϤ⧇āĨ¤ Heap āĻšāϞ⧋ Module 14-āĻāϰ āĻŦāĻŋāώāϝāĻŧāĨ¤
  • scanf āϤ⧋āĻŽāĻžāϰ variable-āĻāϰ āĻ­āĻŋāϤāϰ⧇ āϞ⧇āϖ⧇, āϤāĻžāχ āϤāĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻž āϞāĻžāϗ⧇; array-āϰ āύāĻžāĻŽ āύāĻŋāĻœā§‡āχ āĻāĻ•āϟāĻž āĻ āĻŋāĻ•āĻžāύāĻžāĨ¤ āϝ⧇ variable āĻ āĻŋāĻ•āĻžāύāĻž āϧāϰ⧇ āϰāĻžāϖ⧇, āϏ⧇āϟāĻžāχ pointerāĨ¤

āĻāϰāĻĒāϰ Bob āϞ⧇āϖ⧇ int *p;, āϤāĻžāϰāĻĒāϰ *p = 5;, āφāϰ āϜāĻŋāĻœā§āĻžā§‡āϏ āĻ•āϰ⧇ āĻ“āϰ 5 āϕ⧋āĻĨāĻžāϝāĻŧ āϗ⧇āϞāĨ¤ Lesson 02 āĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻž pointer declare āĻ•āϰāĻŦ⧇, āϤāĻžāϰāĻĒāϰ āϏ⧇āϟāĻžāϰ āĻĒāĻŋāϛ⧁ āĻĒāĻŋāϛ⧁ āϤāĻžāϰ āĻŦāĻžāĻ•ā§āϏ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϝāĻžāĻŦ⧇āĨ¤

lesson ā§§ āĻļ⧇āώ

āĻļ⧇āώ āĻšāϞ⧇ āϚāĻŋāĻšā§āύ āĻĻāĻŋāύ, āĻ…āĻ—ā§āϰāĻ—āϤāĻŋ āφāĻĒāύāĻžāϰ āϏāĻžāĻĨ⧇ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤

āĻĒāϰ⧇āϰāϟāĻž: Pointer: āϝ⧇ variable āĻ āĻŋāĻ•āĻžāύāĻž āϧāϰ⧇ āϰāĻžāϖ⧇