از:
http://www.csd.abdn.ac.uk/~jrl/teaching/CS3008/lecture/l3/l3.htm
C and memory
When we define a new variable, there are three places the where the compiler may reserve space for it:
سي و حافظه:
وقتي كه ما يك متغير جديد تعريف مي كنيم ،
سه مكان مختلف در حافظه ، كامپايلر در نظر مي گيرد.
global variables
in the data segment: a patch of memory reserved by the compiler for global variables - whether explicitly defined, or created by the compiler.
C compilers give the data segment an initial value, which is zero unless you have initialised a variable.
A genuine zero - bit pattern 0000..00 - translates to
0 - for integer types.
0 - for floating point types (if the representation is not 0, then the compiler initialises the space to floating point 0).
null pointers.
On serious unix machines, the data segment may be a big as you need. But note that initialised data is part of the executable file.
The compiler knows the address of global variables.
متغير گلوبال:
در سگمت داده ،data segment ، يك تكه از حافظه براي متغيرهاي گلوبال در نظر گرفته مي شود. چه صريحا ما تعريف كرده باشيم ، چه توسط كامپايلر تعريف شده باشد.
كامپايلر سي ، در قطعه داده ، يك مقدار اوليه براي آنها در نظر مي گيرد ، كه صفر است تا زماني كه شما مقداري به آنها بدهيد.كه اين صفر براي اينتيجر ميشه صفر و براي float هم صفر(...مراجعه به شرح بالا ...) و اشاره گر هم null ميشود. سالك: يعني اشاره گري كه به جايي اشاره نمي كند.
در ماشينهاي يونيكس ، ديتا سگمنت مي تواند به اندازه اي كه شما مي خواهيد بزرگ باشد. اما ..
كامپايلر آدرس متغير گلوبال را مي داند.
local variables
on the stack : when a function is called, the caller reserves space on the stack for its local variables, for the arguments, and for the return address.
Because we always return from one procedure before we return from its caller, stack discipline works. This mechanism allows heavy reuse of space, and allows recursive functions.
The snag is that local variables are not automatically initialised: they become whatever bit pattern was left in that stack space.
It is not a good idea to return a pointer to a local variable. The memory will still be addressable, but its contents depend on later function calls.
The start-up sequence of a program allocates memory for the stack, and puts that into the stack pointer.
When a function is called, it adds enough to the stack pointer so that there is enough space for the return address of the function, and for all the local variables.
a local variable might be addressed as (sp-12).
متغير لوكال(موضعي):
در پشته.(است)
وقتي يك تابع فراخوانده مي شود ، براي متغيرهاي موضعي ، آرگومنت ها و آدرس بازگشت تابع توسط صدا زننده در پشته جا رزرو مي شود.
ايده خوبي نيست كه يك اشاره گر را به يك متغير موضعي نسبت دهيم. زيرا حافظه آدرس دار است ، اما محتويات بسته به احضار بعدي است. (س: بايد شفاف شود كه من بلد نيستم.)
قسمتهاي start-up هر برنامه ، مقدار حافظه لازم براي پشته را تخصيص مي دهد و در stack pointer آدرس را قرار مي دهد. (س: قسمتهاي استارت آپ فكر كنم مربوط به تعريف مدل حافظه و چيزهاي ديگر است كه توربو سي ما معمولا روي small تنظيم است و يكسري تنظيمات ديگر كه اندازه و موقعيت پشته را مشخص مي كند و استك پوينتر يا اشاره گر پشته ، آدرسي است كه امكان استفاده درست از پشته را مي دهد.)
وقتي تابعي فراخوانده مي شود ، استك پوينتر اضافه مي شود . تنظيم براي آدرس بازگشت و متغيرهاي لوكال .
run-time allocations
you may allocate memory on the heap at run time.
تخصيص حافظه موقع اجرا:
شما ممكنه حافظه اي را در heap در زمان run time به كاري اختصاص دهيد.
(س: allocate در فرهنگ لغت به معني اختصاص دادن . معين كردن است.)
.
=====================
اگر كسي نفهميد ، من هم خيلي قسمتها را نفهميدم. مطمئن باشيد من اگر چيزي را بفهمم در بوق و كرنا مي گم . يعني عكس مي كشم ،رنگ مي كنم،هوار مي كنم و .... نه اينجوري، يواشكي.
فعلا يك مروري بكنيد . باز تكرار ميشه همه بحثها . آنقدر تكرار تا بديهي شود.
.
===============================
راستي يك چيزي الان با خوندن اين مقاله يادم آمد.
من براي بازي خود(برنامه نوشته شده خود) دو تا آرايه بزرگ دو بعدي و
گلوبال ساختم. مثلا 100 در 100 ، سومي را كه خواستم بسازم ، نگذاشت .
فكر كنم حالا علتشو و راه حلشو فهميدم.
علتش اين بوده كه در سگمنت داده ساخته مي شده و چون محدود بوده فضايش ، بيشتر نداشته بدهد. با توابع تخصيص حافظه كه فكر كنم از heap مي گيره حافظه را فكر كنم اين مشكل حل مي شده.
اساتيد محترم ، آيا اين علت و اين راه حل كه من گفتم درست بود؟؟
.
يك چيز را هم بايد نگاه كنم و تنبلي مي كنم. فكر كنم در كتاب جناب جعفرنژاد گفته بود در مدل small قطعه داده و قطعه پشته يكي است. يعني هر دو با هم مي شوند 64 كيلو(عدد را شك دارم) ، پس تمامي متغيرهاي گلوبال(كه جاشون در قطعه داده است) و متغيرهاي لوكال(كه جاشون در پشته است) بايد مهربون كنار هم در اين قطعه 64 كيلويي بنشينند(در مدل small ) و حافظه heap هم اونور خودشو باد بزنه و كاري انجام ندهد!!
.