I wrote the following code:
#include <stdio.h>
int array[] = {23, 43, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int main()
{
int test = -1;
if (test <= TOTAL_ELEMENTS)
{
printf("Hello, got here!\n");
}
}
When I compile this code (with gcc main.c -Wall
(no warnings!)), and run it, the printf
fails to execute. I mean, test
= -1
, and that is definitely smaller than the size of the array (7 digits). Where is the bug?
CodePudding user response:
The bug was in the difference between unsigned
and signed
. Specifically, the defined variable TOTAL_ELEMENTS
's type is unsigned int
(sizeof
returns unsigned
because a size can never be negative). The test is comparing a signed int
with an unsigned int
. That fails because test
is promoted to unsigned
. -1 turned into unsigned becomes a large positive integer, thus making the if
conditional return false.
If you compile with gcc main.c -Wall -Wextra
it will warn.