Help me cast this!: Ultrix 2.x bug

SuperUser root at mfci.UUCP
Thu May 5 12:56:00 AEST 1988


Expires:

Followup-To:

Distribution:


In article <11344 at mimsy.UUCP> chris at mimsy.UUCP (Chris Torek) writes:
>context:
>struct outfile (*output)[] = <<cast>>malloc(sizeof(struct outfile) * 3);
>...
>>	output = (struct outfile **)malloc(sizeof(struct outfile) * 3);
>>
>>works on Ultrix 2.something ....
>
>... but only because of a compiler bug.  Obviously DEC have
>not installed Guy Harris's fixes to chkpun() in mip/trees.c.

Since "type (*)[...]" and "type **" are clearly incompatible types, I
consider the above example to be terrible style.  However, pcc compilers
don't give a warning, and I was once told that Dennis Ritchie considers
it to be perfectly legal C.  So even though I consider it to be brain
damaged to treat * and [] as equivalent other than at the top level, I
am currently under the impression that this is standard K&R C.

>From your posting, it sounds like Guy Harris added a warning for this
case, and in fact I noticed that suns also warn.  I certainly agree with
the motivation for giving a warning, but I'm not convinced that it is
considered correct to do so.

Anyway, here's my personal view of pointers in C:

% cat apt.c
int     a;
int     b[5];
int     c[4][5];
int     d[3][4][5];

int    *pa;
int   (*pb)[5];
int   (*pc)[4][5];
int   (*pd)[3][4][5];

int    *qa;
int    *qb;
int   (*qc)[5];
int   (*qd)[4][5];

int     x;
int    *px;
int   **ppx;
int   (*xx)[10];

main()
{
    a          = 1;
    b[2]       = 2;
    c[2][3]    = 3;
    d[2][3][4] = 4;


    /**
    *** Cumbersome purist style:
    **/

    pa = &a;
    pb = (int (*)[5]) b;            /* &b */
    pc = (int (*)[4][5]) c;         /* &c */
    pd = (int (*)[3][4][5]) d;      /* &d */

    printf("%d %d %d %d\n", *pa, (*pb)[2], (*pc)[2][3], (*pd)[2][3][4]);


    /**
    *** Normal C style:
    **/

    qa = &a;
    qb = b;
    qc = c;
    qd = d;

    printf("%d %d %d %d\n", *qa, qb[2], qc[2][3], qd[2][3][4]);


    /**
    *** Brain damaged style.  I've been told that Ritchie claims this is
    *** legal C.  If so then I consider it to be a bug in the language.
    **/

    pa = &a;
    pb = (int **) b;        /* brain damage */
    pc = (int ***) c;       /* brain damage */
    pd = (int ****) d;      /* brain damage */

    printf("%d %d %d %d\n", *pa, (*pb)[2], (*pc)[2][3], (*pd)[2][3][4]);


    /**
    *** Example of brain damage in action:
    **/

    x   = 123;
    px  = &x;
    ppx = &px;
    xx  = &px;              /* brain damage */

    printf("%d %d %d\n", **ppx, **xx == (int) &x, *(int *)**xx);
}
% cc apt.c -o apt
% apt
1 2 3 4
1 2 3 4
1 2 3 4
123 1 123
%



More information about the Comp.lang.c mailing list