Module ā§§ā§§ ¡ Pointer āĻāϰ memory
Memory āĻāϰ āĻ āĻŋāĻāĻžāύāĻž: āĻĒā§āϰāϤāĻŋāĻāĻž āĻŦāĻžāĻā§āϏā§āϰ āĻāĻāĻāĻž āύāĻŽā§āĻŦāϰ āĻāĻā§
āĻāĻ 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-āĻ āĻŦāĻĻāϞāĻžāϝāĻŧāĨ¤
| āύāĻžāĻŽ | Type | Byte | āĻŦāĻžāύāĻžāύ⧠āĻ āĻŋāĻāĻžāύāĻž | āĻŽāĻžāύ |
|---|---|---|---|---|
a | int | 4 | 1000 | 1 |
b | int | 4 | 1004 | 2 |
d | double | 8 | 1008 | 3.0 |
marks[0] | int | 4 | 1016 | 70 |
marks[1] | int | 4 | 1020 | 80 |
marks[2] | int | 4 | 1024 | 90 |
marks[3] | int | 4 | 1028 | 60 |
āĻļā§āώ āϞāĻžāĻāύāĻāĻž āĻĒā§āϰāϤāĻŋāĻāĻž run-āĻ print āĻāϰ⧠1 2 3.0 70āĨ¤ āύāĻĄāĻŧā§ āĻļā§āϧ⧠āϤāĻžāϰ āĻāĻĒāϰā§āϰ āϏāĻžāϤāĻāĻž āĻ āĻŋāĻāĻžāύāĻžāĨ¤
āϤāĻžāĻ &x āĻāĻāĻāĻž āϏāĻāĻā§āϝāĻž: x-āĻāϰ āĻĒā§āϰāĻĨāĻŽ byte-āĻāϰ āĻ āĻŋāĻāĻžāύāĻžāĨ¤
Playground-āĻ āĻĻā§āĻāĻāĻž run: āύāϤā§āύ āϏāĻāĻā§āϝāĻž, āĻāĻāĻ āĻĻā§āϰāϤā§āĻŦ
āĻāĻ āĻšāϞ⧠Playground-āĻ āĻāĻ program-āĻāϰ āĻĻā§āĻāĻāĻž run, āĻŽāĻžāĻā§ āĻāĻŋāĻā§āĻ āĻŦāĻĻāϞāĻžāύ⧠āĻšāϝāĻŧāύāĻŋāĨ¤ āĻļā§āώ āĻāϞāĻžāĻŽā§ āĻāĻā§, āĻĒā§āϰāϤāĻŋāĻāĻž āĻ āĻŋāĻāĻžāύāĻž &a āĻĨā§āĻā§ āĻāϤ byte āĻĻā§āϰā§āĨ¤
| āϞāĻžāĻāύ | Run 1 | Run 2 | &a-āĻāϰ āĻāϤ byte āĻĒāϰ⧠|
|---|---|---|---|
&a | 0x7ffe8f424bc0 | 0x7ffddb90d230 | 0 |
&b | 0x7ffe8f424bc4 | 0x7ffddb90d234 | 4 |
&d | 0x7ffe8f424bc8 | 0x7ffddb90d238 | 8 |
&marks[0] | 0x7ffe8f424bd0 | 0x7ffddb90d240 | 16 |
&marks[1] | 0x7ffe8f424bd4 | 0x7ffddb90d244 | 20 |
&marks[2] | 0x7ffe8f424bd8 | 0x7ffddb90d248 | 24 |
&marks[3] | 0x7ffe8f424bdc | 0x7ffddb90d24c | 28 |
āĻĻā§āϰāϤā§āĻŦ āĻĒāĻĄāĻŧāϤ⧠āĻļā§āώā§āϰ 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-āĻ |
|---|---|---|---|
int | 0x7ffd8d6d3850 | 0x7ffd8d6d3854 | 4 |
char | 0x7ffd8d6d384d | 0x7ffd8d6d384e | 1 |
double | 0x7ffd8d6d3860 | 0x7ffd8d6d3868 | 8 |
long long | 0x7ffd8d6d3880 | 0x7ffd8d6d3888 | 8 |
āĻāĻ 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-āĻāϰ; āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āĻ āĻ āĻŋāĻāĻžāύāĻž āύāĻŋāĻā§āĨ¤
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, āĻāĻāĻāĻž āĻāĻĒāĻŋ | 0 | 31 |
set_to_31 return āĻāϰāĻžāϰ āĻĒāϰ⧠| 0 | frame-āĻāϰ āϏāĻžāĻĨā§ āĻšāĻžāϰāĻŋāϝāĻŧā§ āĻā§āĻā§ | |
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-āĻāϰ frame | 1000 | 40 |
marks[1] | main-āĻāϰ frame | 1004 | 55 |
marks[2] | main-āĻāϰ frame | 1008 | 72 |
a | show_where-āĻāϰ frame | 960 | 1000, āĻŽāĻžāύ⧠marks[0]-āĻāϰ āĻ āĻŋāĻāĻžāύāĻž |
n | show_where-āĻāϰ frame | 968 | 3, āĻāĻāĻāĻž āĻāĻĒāĻŋ |
Compiler Explorer-āĻ āĻāĻāĻŦāĻžāϰ run āĻāϰ⧠āϤāĻŋāύāĻāĻž āϞāĻžāĻāύā§āĻ āĻāĻāĻ āĻ āĻŋāĻāĻžāύāĻž print āĻšāϝāĻŧā§āĻā§āĨ¤ āϤā§āĻŽāĻžāϰ āϏāĻāĻā§āϝāĻž āĻāϞāĻžāĻĻāĻž āĻšāĻŦā§, āϤāĻŦā§ āϤā§āĻŽāĻžāϰ āϤāĻŋāύāĻāĻž āϞāĻžāĻāύāĻ āĻāĻā§ āĻ
āύā§āϝā§āϰ āϏāĻžāĻĨā§ āĻŽāĻŋāϞāĻŦā§āĨ¤ Parameter a āϧāϰ⧠āϰāĻžāĻā§ marks[0]-āĻāϰ āĻ āĻŋāĻāĻžāύāĻž, āĻāϰ āĻāĻāĻžāĻŦā§āĻ Module 9-āĻāϰ function-āĻā§āϞ⧠main-āĻāϰ āĻŦāĻžāĻā§āϏ⧠āĻĒā§āĻāĻāĻžāϤāĨ¤
āϤāĻžāĻ ampersand-āĻāϰ āύāĻŋāϝāĻŧāĻŽ āĻāĻāύ⧠āĻāĻžāĻā§āύāĻŋ: & āĻāĻŋāĻā§āĻā§āϏ āĻāϰ⧠āĻāĻāĻāĻž āĻŦāĻžāĻā§āϏ āĻā§āĻĨāĻžāϝāĻŧ āĻĨāĻžāĻā§, āĻāϰ array-āϰ āύāĻžāĻŽ āύāĻŋāĻā§āĻ āϏā§āĻāĻž āĻŦāϞ⧠āĻĻā§āϝāĻŧāĨ¤ Module 3-āĻāϰ scanf("%d", roll) āĻšāĻžāϤ⧠āĻĻāĻŋāϝāĻŧā§āĻāĻŋāϞ roll-āĻāϰ āĻāĻŋāϤāϰā§āϰ āϏāĻāĻā§āϝāĻžāĻāĻž, āĻāϰ scanf āϏā§āĻāĻžāĻā§āĻ āĻ āĻŋāĻāĻžāύāĻž āĻā§āĻŦā§ āύāĻŋāϝāĻŧā§āĻāĻŋāϞāĨ¤
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 āĻāϰā§āĻāĻŋāϞāĨ¤
āϝāĻž āĻāĻā§ āĻĨā§āĻā§ āĻ
āύā§āĻŽāĻžāύ āĻāϰā§āύāĻŋ, 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-āĻ āĻāĻžāĻā§, āϏā§āĻāĻž āϝā§āĻā§āύ⧠āĻāĻāĻāĻž āĻ āĻŋāĻāĻžāύāĻžāϰ āĻā§āϝāĻŧā§ āĻŦā§āĻļāĻŋ āĻāĻžāĻā§āϰāĨ¤
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 āĻā§ āĻĒāĻžāϝāĻŧ | āĻā§āύ |
|---|---|---|
name | name[0]-āĻāϰ āĻ āĻŋāĻāĻžāύāĻž | array-āϰ āĻāĻžāϞāĻŋ āύāĻžāĻŽ āύāĻŋāĻā§āĻ āĻāĻāĻāĻž āĻ āĻŋāĻāĻžāύāĻž |
&n | n-āĻāϰ āĻ āĻŋāĻāĻžāύāĻž | āĻāĻāĻāĻž 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-āϰ āĻāĻžāϞāĻŋ āύāĻžāĻŽā§āϰ āĻāĻāύ⧠āϞāĻžāĻā§ āύāĻžāĨ¤
āĻāĻāĻž āĻā§āĻĨāĻžāϝāĻŧ āĻāĻžāĻā§ āϞāĻžāĻā§
- 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āĨ¤
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 CompilerMaria āĻāĻāĻāĻž āĻāĻĻāĻžāĻšāϰāĻŖā§ āĻā§āĻļāĻŋ āύāĻž, āĻ āύāĻŋāϝāĻŧāĻŽāĻāĻž āĻāĻžāϝāĻŧ: āĻĻā§āĻ āĻŦāĻžāĻā§āϏā§āϰ āĻŽāĻžāĻā§āϰ āϧāĻžāĻĒ āĻāĻŋ āϏāĻŦāϏāĻŽāϝāĻŧ āĻāĻ āĻŦāĻžāĻā§āϏā§āϰ āĻŽāĻžāĻĒā§āϰ āϏāĻŽāĻžāύ? āĻĒāĻžāĻāĻāĻāĻž 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 āĻ āĻŋāĻāĻžāύāĻž āϧāϰ⧠āϰāĻžāĻā§