Yes the malloc is ok.
NULL is defined as (void *) 0 and that's not the content of stream, i did your test and he didn't put 0xaa on the output.

For example:

if(stream == NULL)
{
     P2 = 0xaa;
}
else
{
     P2 = 0xf0;
}

gives 0xf0 on the output

Even the simplest main with malloc fails:

void main(void)
{
     unsigned char * stream;
     stream = (unsigned char *) malloc(1);
     if(stream == NULL)
     {
          P2 = 0xf0;
     }
     else
     {
          *stream = 0xaa;
          P2 = *stream;
     }
}

Gives nothing on the output port P2

I also took a look at the assembly file and it looks fine to me for all my test programs.
I see that he loads 1 in the dptr, probably the 1 byte i want to allocate with malloc, then he lcall's the subroutine _malloc, then he moves the 3 byte address in r2, r3, r4. then the NULL check is nothing more than 3 times a compare and jump not equal on 0 value followed by placing 0xf0 on P2 like it should be.
In the other case i see that the pointer address is loaded, followed by putting 0xaa in the accumulator followed by an lcall to __gptrput like it should be.
Then the pointer address is moved again in the registers followed by a lcall to __gptrget and a move of the accumulator to P2 since __gptrget stocks his result in the accumulator.

;    main.c:12: test = (unsigned char *) malloc(1);
    mov    dptr,#0x0001
    lcall    _malloc
    mov    r2,dpl
    mov    r3,dph
    mov    r4,#0x00
;    main.c:13: if(test == NULL)
    cjne    r2,#0x00,00102$
    cjne    r3,#0x00,00102$
    cjne    r4,#0x00,00102$
;    main.c:15: P2 = 0xf0;
    mov    _P2,#0xF0
    sjmp    00105$
00102$:
;    main.c:19: *test = 0xaa;
    mov    dpl,r2
    mov    dph,r3
    mov    b,r4
    mov    a,#0xAA
    lcall    __gptrput
;    main.c:20: P2 = *test;
    mov    dpl,r2
    mov    dph,r3
    mov    b,r4
    lcall    __gptrget
    mov    _P2,a

It makes no sense to me, the only thing i can think of is that the compiler doesnt make the right hex file for loading in my µc...
Still thanks for the reply.

2009/7/3 Bodo Wenzel <bodowenzel@web.de>
> if(stream == NULL)
>      return NULL;
Are you sure that malloc() returned a valid pointer?

For debugging I would change this code into:

if (stream == NULL) {
 P2 = 0xAA;
 return NULL;
}

Or, as I know assembler, I would look into the machine code to check it does
The Right Thing(TM).

HTH, Bodo


------------------------------------------------------------------------------
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user