Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!linus!philabs!cmcl2!harvard!topaz!bentley!kwh From: kwh@bentley.UUCP (KW Heuer) Newsgroups: net.lang.c Subject: Re: malloc() Message-ID: <815@bentley.UUCP> Date: Tue, 13-May-86 21:42:58 EDT Article-I.D.: bentley.815 Posted: Tue May 13 21:42:58 1986 Date-Received: Thu, 15-May-86 05:44:53 EDT References: <866@ttrdc.UUCP> Organization: AT&T Bell Laboratories, Liberty Corner Lines: 41 In article <866@ttrdc.UUCP> ttrdc!levy (Dan Levy) writes: >Y'know--while I'm thinking about it, why IS malloc() set up to return a >(char *) pointer at all, if that IS inviting a potential (or at least to >lint's little mind) pointer alignment problem? Since malloc() is supposed >to return a maximally aligned pointer, seems to me that it should have >been set up to return a (double *). Yes, yes, before flames of misunder- >standing start, I _KNOW_ that the convention for malloc() is to return >a (char *) and that it returns a maximally aligned pointer just the same >because of the way it has been written. It just seems that the methodology >was back-a**wards, that at least returning a (double *) would indicate an >implicit promise to the user (and to lint-like checking) that the return >value WAS maximally aligned. The only problem I could see with this kind >of scheme is that some systems might not support double. But that could >be gotten around by #defining a malloc_t type that would represent the >maximally aligned data type of the machine at hand. This is what I started to mention once before, and picked up a lot of "no, you don't understand how it works" messages (sigh). I saw the need for a "ALIGN *" datatype, and was hoping "void *" would be it. (Nope, just a useless synonym for "char *"). The idea would be that, just as it's always legal to cast any pointer into a "char *", it would be legal to cast *from* "ALIGN *" to any pointer. Then lint would shut up about malloc()! Also, having malloc() return a real "ALIGN *" would be convenient for word- addressible machines where "char *" requires extra bits. Btw, if I really want to reduce the signal/noise ratio in lint, I use #if lint extern char *cmalloc(); extern int *imalloc(); extern struct foo *fmalloc(); ... #else extern char *malloc(); #define cmalloc(n) ((char *)malloc((n)*sizeof(char)) #define imalloc(n) ((int *)malloc((n)*sizeof(int)) #define fmalloc(n) ((struct foo *)malloc((n)*sizeof(struct foo)) ... #endif Karl W. Z. Heuer (ihnp4!bentley!kwh), The Walking Lint