Thursday, January 29, 2009

does uninitialized variables have null or zero value?

If an uninitialized variable is local it will have an undefined value. Remember that local variables are allocated in the stack and while a space will be allocated for that variable in the stack, whatever value the memory have at the time of the allocation will be the initial value of that uninitialized variable. Try running below code and take note of variable "y"'s value.

void do_test_uninitialized_var()
{
int x, y;
for (x=0; x<5; x++) { y++; }
printf("Y[%d]\n", y);
return;
}

int main(int argc, char *argv[])
{
do_test_uninitialized_var();
return 0;
}


The following output results after several run:

c0r3dump@debian:~/workspace2/testUtils/Debug$ ./test_uninitialized_var
Y[-1208861771]
c0r3dump@debian:~/workspace2/testUtils/Debug$ ./test_uninitialized_var
Y[-1208206411]
c0r3dump@debian:~/workspace2/testUtils/Debug$ ./test_uninitialized_var
Y[-1208845387]
c0r3dump@debian:~/workspace2/testUtils/Debug$ ./test_uninitialized_var
Y[-1208575051]
c0r3dump@debian:~/workspace2/testUtils/Debug$ ./test_uninitialized_var
Y[-1208214603]

For variables declared in the heap (global variables/static local variables), they are usually initialized to zero.

int k; //globals are heaped

void do_test_uninitialized_var()
{
int x, y; //locals are stacked

printf("Y[%d] K[%d]\n", y, k);
for (x=0; x<5; x++) { y++; k++; }
printf("Y[%d] K[%d]\n", y, k);

return;
}

int main(int argc, char *argv[])
{
do_test_uninitialized_var();
return 0;
}

output:
c0r3dump@debian:~/workspace2/testUtils/Debug$ ./test_uninitialized_var
Y[-1208964176] K[0]
Y[-1208964171] K[5]
c0r3dump@debian:~/workspace2/testUtils/Debug$ ./test_uninitialized_var
Y[-1208546384] K[0]
Y[-1208546379] K[5]
c0r3dump@debian:~/workspace2/testUtils/Debug$ ./test_uninitialized_var
Y[-1208673360] K[0]
Y[-1208673355] K[5]



No comments:

Post a Comment