5

I have some C code that is something of a puzzle. For a reason to do with this code, I'm wondering how I can tell if a struct object is ending up on the heap or stack?

The objects are not being created with malloc or calloc. They start their life in the form of an array. For the purposes of this post, I'm going to call the struct Emp.

Emp myEmp[6]; /* Each myEmp[?] item is populated in code */ 

The objects are sorted and manipulated in various ways and at some point, the objects are copied and then handed to a array-pointer. The copy is done via memcpy. The objects are then put in to something like: Emp* emps_a[6].

The objects go from a copy and are assigned in to the above emps_a.

int i; for( i = 0; i < n; i++ ) { emps_a[i] = myEmpsCopy + i; } 

I'm not sure if some or any of this has bearing on my question. I never need free() or do memory clean up... I'm afraid I don't know too much about C.

The help is greatly appreciated.

1
  • 3
    Rule of thumb: if you called malloc, you must call free. The inverse--If you didn't call malloc, you mustn't call free--is usually, but not always, true. (Some functions will call malloc for you. If they do, this should be spelled out in big red letters in the function's documentation.) Commented Jun 29, 2009 at 3:40

1 Answer 1

17

Leaving global variables and variables declared with static modifier (which are allocated in a separate memory region) aside, local variables declared in a function body are allocated on the stack whereas whatever you call malloc for is allocated on the heap. Also, C99 variable sized arrays and memory allocated with _alloca will end up on stack.

int* x[10]; // The addresses are held on the stack int i; // On the stack for(i = 0; i < 10; ++i) x[i] = malloc(sizeof(int)*10); // Allocates memory on the heap 

For example, in the above code, there's an array of int* values on the stack holding addresses to 10 different locations in the heap.

Sign up to request clarification or add additional context in comments.

8 Comments

...and "static" variables are probably in their own region of memory.
Yeah, along with globally declared things.
C is very explicit. If you don't malloc() it, it's not on the heap.
Indeed. In C, that's the whole thing. C++ might run constructors that can end up putting some stuff on heap too.
"Whatever you're declaring statically in a function body is allocated on stack" -- garbage and needed editing before it deserved to be accepted. Whatever you're declaring NON-STATICALLY in a function body is allocated on stack...
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.