Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Malloc ,calloc code problem

  1. Oct 21, 2008 #1
    Code (Text):

    #include <stdio.h>
    #include <stdlib.h>
    /* required for the malloc, calloc and free functions */

    int main() {
      float *calloc1, *calloc2, *malloc1, *malloc2;
      int i;

      calloc1 = calloc(3, sizeof(float)); /* might need to cast */
      calloc2 = calloc(3, sizeof(float));
      malloc1 = malloc(3 * sizeof(float));
      malloc2 = malloc(3 * sizeof(float));

    if(calloc1!=NULL && calloc2!=NULL && malloc1!=NULL && malloc2!=NULL) {

        for(i=0 ; i<3 ; i++) {
          printf("calloc1[%d] holds %05.5f, ", i, calloc1[i]);
          printf("malloc1[%d] holds %05.5f\n", i, malloc1[i]);
          printf("calloc2[%d] holds %05.5f, ", i, *(calloc2+i));
          printf("malloc2[%d] holds %05.5f\n", i, *(malloc2+i));


        return 0;
      else {
        printf("Not enough memory\n");
        return 1;

    calloc1[0] holds 0.00000, malloc1[0] holds -431602080.00000
    calloc2[0] holds 0.00000, malloc2[0] holds -431602080.00000
    calloc1[1] holds 0.00000, malloc1[1] holds -431602080.00000
    calloc2[1] holds 0.00000, malloc2[1] holds -431602080.00000
    calloc1[2] holds 0.00000, malloc1[2] holds -431602080.00000
    calloc2[2] holds 0.00000, malloc2[2] holds -431602080.00000

    at first they build 4 pointers
    each one of them points to the start of a sector whose size is 3 float variables.

    then the print some how
    calloc1 should return only the address

    *(calloc2+i) should return the data inside the address

    but they get similar output

    i cant understand these printf lines

  2. jcsd
  3. Oct 21, 2008 #2

    Err, no. Both of those commands are equivalent, and return the data at the i-th element of the array calloc1.

    If you want to return the address, use &calloc1 or calloc1+i.
  4. Oct 23, 2008 #3
    the calloc needs to return an address to which every cell is empty
    but when we print calloc1 (which is the content of cell "i")
    we get the value -431602080.00000 instead of empty or some thing like that

    why is that?
  5. Oct 23, 2008 #4


    User Avatar
    Science Advisor
    Homework Helper

    malloc and calloc are equivalent except that calloc also does a memset() on the allocated memory. In fact on most unix implementations they are identical - malloc will also return memory that is zeroed.
    You are printing a float representation of some random memory contents (possibly all 1s?) only all bits zero is guaranteed to produce a float output of zero.
  6. Oct 24, 2008 #5


    User Avatar
    Science Advisor

    That was also my understanding mgb. I wonder why it is that transg was getting calloc1 = -431602080.00000 in this case? (assuming some valid "i").
  7. Oct 24, 2008 #6


    User Avatar
    Science Advisor
    Homework Helper

    He isn't - all the calloc values are printing 0.0. That's part of IEEE float standard, all zero bits gives 0.0, the malloc are printing some garbage bcause the memory is initialised to something else.
    Win32 inits malloc memory to 0xCE (or similair) so you know where it came from, some IBM machines used to use 0xDEADBEEF
  8. Oct 24, 2008 #7
    Which causes all kinds of havoc when porting between Unix compilers and, say, MSVC, as Unix developers tend to get into the habit of using malloc for everything. But then, I suppose that's what purify is for...
  9. Oct 24, 2008 #8

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    There is absolutely no difference between *(calloc1+i) and calloc1 -- or i[calloc1], for that matter. The square brackets in C are just syntactic sugar1, unfortunately. The compiler immediate translates foo[bar] to *(foo+bar).

    1 Except when they aren't syntactic sugar, which is even more unfortunate. The square brackets mean something quite different for multidimensional arrays such as double matrix[3][3] and ragged arrays such as double **ragged. With these declarations, matrix[2][2] is exactly the same as *(matrix+2+2*3) while ragged[2][2] is exactly identical to *(*(ragged+2)+2) .
  10. Oct 25, 2008 #9


    User Avatar
    Science Advisor

    Ok but he did specifically say that this was not working for him though I agree that it should be printing zeros. Anyway I guess we can put this down to misinformation from a noob user in transgalactic?
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook