when the memory is cleared on stack for a local function?

I want to know when exactly the memory is cleared in stack which is allocated for local function calls. I have seen in some video tutorial when the function call is returned to main the memory which is allocated for local function is cleared. I have few questions on below program, please explain.

#include<stdio.h>

void print(){
printf("testing n");
}

int* sum(int* a, int* b){
int c = *a + *b;
return &c;
}

int main(){
int a=3,b=2;
int *ptr = sum(&a,&b);
print();          
printf("sum is: %d",*ptr);
return 0;
}

when I run the above program, it is printing garbage value which is expected. But if I comment "print()" function in main and then run the program it is printing correct value of sum.

  • Is this mean that even though the execution of local function is completed in stack, until there is another function call to the stack, the previous allocated memory is not cleared ?

  • If I remove the "printf" statement in "print()" and keep the "print()" call in main, then I could see the result of sum as normal. Why it didn't overwrite the memory in stack?


  • C has no stack, the word stack is not even mentioned in the standard (C89, C99 or C11). An implementation may use a stack to provide the behavioural aspects of the C abstract machine but it's the abstract machine itself which the standard specifies.

    So, as to when the stack is cleared (assuming it even exists), that's something that's totally up to the implementation. What you are doing is basically undefined behaviour, accessing an object after its lifetime has ended, so the results can be anything the implementation chooses.

    As to why you can access the items after their lifetime has ended for a specific implementation, most likely it's because entering and exiting a function doesn't clear the stack, it simply adjusts the stack pointer (a lot more efficient than having to clear the memory as well).

    So, unless something overwrites what's at that memory location (such as a subsequent call to printf ), it'll probably remain at whatever it was last set to.

    By way of example, here's a sample prolog code for a function:

    push  ebp       ; Save the frame pointer.
    mov   ebp, esp  ; Set frame pointer to current stack pointer.
    sub   esp, XX   ; Allocate XX space for this frame.
    

    and its equivalent epilog:

    mov   esp, ebp  ; Restore stack pointer.
    pop   ebp       ; Get previous frame pointer.
    ret             ; Return.
    

    Note that neither the allocation of space ( sub in the prolog) nor the deallocation of it ( mov in the epilog) actually clears the memory it's using.

    However, as stated, it's not something you should rely on.


    The answer to your question is operating system specific. In a system that creates process from scratch (VMS/NT) the stack gets cleared only when the process is created. The stack is created from demand-zero pages. When a stack page is accessed for the first time, the operating system creates a new zero pages.

    In forking systems the stack gets cleared out whenever a new executable is loaded. Usually the process is the same as above.

    After the stack is created, whatever is put there stays there until overwritten.

    The stack is managed by the operating system; not the programming languages.

    链接地址: http://www.djcxy.com/p/14022.html

    上一篇: 这个C函数应该总是返回false,但它不会

    下一篇: 当堆栈上的内存被清除为本地函数时?