You may have undefined behavior, with the following scenario:
-
int nbins;
does not initializenbins
, so it contains junk data, potentially a very large number. -
fread(&nbins, sizeof(int), 1, fd);
is not tested so could fail and keepnbins
uninitialized. Read about fread. -
printf("nbins = %d", nbins);
has no\n
and is not followed by an explicitfflush
so don’t show anything (sincestdout
is usually line-buffered). -
coords = malloc(nbins * sizeof(float));
would request a huge amount of memory, so would fail and getNULL
incoords
-
fread(coords, sizeof(float), nbins, fd);
writes to theNULL
pointer, giving a segmentation violation, since UB
You are very lucky. Things could be worse (we all could be annihilated by a black hole). You could also experiment some nasal demons, or even worse, have some execution which seems to apparently work.
Next time, please avoid UB. I don’t want to disappear in a black hole, so bear with us.
BTW, if you use GCC, compile with all warnings and debug info : gcc -Wall -Wextra -g
. It would have warned you. And if it did not, you’ll get the SEGV under the gdb
debugger. On Linux both valgrind and strace could have helped too.
Notice that useless initialization (e.g. an explicit int nbins = 0;
in your case) don’t harm in practice. The optimizing compiler is likely to remove them if they are useless (and when they are not useless, as in your case, they are very fast).
Mandatory read
Lattner’s blog: What Every C Programmer should know about UB. Related notion: the As-if rule.
Read also the documentation of every function you are using (even as common as printf
).