繁体   English   中英

gcc:“malloc”的类型冲突; 有 'char *()' - 试图构建一个古老版本的 ls

[英]gcc: conflicting types for 'malloc'; have 'char *()' - trying to build an ancient version of ls

我正在尝试构建一个古老版本的ls命令(用 pre-ANSI/ISO C 编写)。 但是我收到了很多警告,其中大多数我可以修复,但是我也收到了一些错误。 这是其中之一: error: conflicting types for 'malloc'; have 'char *()' error: conflicting types for 'malloc'; have 'char *()'

这是程序的受影响部分:

    static char sccsid[] = "@(#)ls.c    1.21";
/*
*   list file or directory;
*   define DOTSUP to suppress listing of files beginning with dot
*/

#include    <sys/param.h>
#include    <sys/types.h>
#include    <sys/sysmacros.h>
#include    <sys/stat.h>
#include    <sys/dir.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>

#ifndef STANDALONE
#define TERMINFO
#endif

/* -DNOTERMINFO can be defined on the cc command line to prevent
 * the use of terminfo.  This should be done on systems not having
 * the terminfo feature (pre 6.0 sytems ?).
 * As a result, columnar listings assume 80 columns for output,
 * unless told otherwise via the COLUMNS environment variable.
 */
#ifdef NOTERMINFO
#undef TERMINFO
#endif

#ifdef TERMINFO
#include    <curses.h>
#include    <term.h>
#endif

#define DOTSUP  1
#define ISARG   0100000 /* this bit equals 1 in lflags of structure lbuf 
                        *  if *namep is to be used;
                        */
#define DIRECT  10  /* Number of direct blocks */

#ifdef u370
    /* Number of pointers in an indirect block */
#define INDIR   (BSIZE/sizeof(daddr_t))
    /* Number of right shifts to divide by INDIR */
#define INSHFT  10
#else
    /* Number of pointers in an indirect block */
#define INDIR   128
    /* Number of right shifts to divide by INDIR */
#define INSHFT  7
#endif


struct  lbuf    {
    union   {
        char    lname[DIRSIZ];   /* used for filename in a directory */
        char    *namep;          /* for name in ls-command; */
    } ln;
    char    ltype;      /* filetype */
    unsigned short  lnum;   /* inode number of file */
    short   lflags;     /* 0777 bits used as r,w,x permissions */
    short   lnl;        /* number of links to file */
    unsigned short  luid;
    unsigned short  lgid;
    long    lsize;      /* filesize or major/minor dev numbers */
    long    lmtime;
};

struct dchain {
    char *dc_name;      /* path name */
    struct dchain *dc_next; /* next directory in the chain */
};

struct dchain *dfirst;  /* start of the dir chain */
struct dchain *cdfirst; /* start of the durrent dir chain */
struct dchain *dtemp;   /* temporary - used for linking */
char *curdir;       /* the current directory */

int nfiles = 0; /* number of flist entries in current use */
int nargs = 0;  /* number of flist entries used for arguments */
int maxfils = 0;    /* number of flist/lbuf entries allocated */
int maxn = 0;   /* number of flist entries with lbufs assigned */
int quantn = 1024;  /* allocation growth quantum */

struct  lbuf    *nxtlbf;    /* pointer to next lbuf to be assigned */
struct  lbuf    **flist;    /* pointer to list of lbuf pointers */
struct  lbuf    *gstat();

FILE    *pwdfu, *pwdfg, *dirf;

int aflg, bflg, cflg, dflg, fflg, gflg, iflg, lflg, mflg;
int nflg, oflg, pflg, qflg, sflg, tflg, uflg, xflg;
int Cflg, Fflg, Rflg;
int rflg = 1;   /* initialized to 1 for special use in compar() */
int flags;
int err = 0;    /* Contains return code */

char    *dmark; /* Used if -p option active. Contains "/" or NULL. */

unsigned    lastuid = -1, lastgid = -1;
int statreq;    /* is > 0 if any of sflg, (n)lflg, tflg are on */

char    *dotp = ".";
char    *makename();
char    tbufu[16], tbufg[16];   /* assumed 15 = max. length of user/group name */
char    *ctime();

long    nblock();
long    tblocks;  /* total number of blocks of files in a directory */
long    year, now;

int num_cols = 80;
int colwidth;
int filewidth;
int fixedwidth;
int curcol;
int compar();

int new_line()
{
    if (curcol) {
        putc('\n',stdout);
        curcol = 0;
    }
}

int pprintf(char *s1, char *s2)
{
    register char *s;
    register int   c;
    register int  cc;
    int i;

    for (s = s1, i = 0; i < 2; i++, s = s2)
        while(c = *s++) {
            if (c < ' ' || c >= 0177) {
                if (qflg)
                    c = '?';
                else if (bflg) {
                    curcol += 3;
                    putc ('\\', stdout);
                    cc = '0' + (c>>6 & 07);
                    putc (cc, stdout);
                    cc = '0' + (c>>3 & 07);
                    putc (cc, stdout);
                    c = '0' + (c & 07);
                }
            }
            curcol++;
            putc(c, stdout);
        }
}

/*
 * pdirectory: print the directory name, labelling it if title is
 * nonzero, using lp as the place to start reading in the dir.
 */
int pdirectory (char *name, int title, int lp)
{
    register struct dchain *dp;
    register struct lbuf *ap;
    register char *pname;
    register int j;

    filewidth = 0;
    curdir = name;
    if (title) {
        putc('\n', stdout);
        pprintf(name, ":");
        new_line();
    }
    nfiles = lp;
    readdir(name);
    if (fflg==0)
        qsort(&flist[lp],(unsigned)(nfiles - lp),sizeof(struct lbuf *),compar);
    if (Rflg) for (j = nfiles - 1; j >= lp; j--) {
        ap = flist[j];
        if (ap->ltype == 'd' && strcmp(ap->ln.lname, ".") &&
                strcmp(ap->ln.lname, "..")) {
            dp = (struct dchain *)calloc(1,sizeof(struct dchain));
            if (dp == NULL)
                fprintf(stderr,"ls: out of memory\n");
            pname = makename(curdir, ap->ln.lname);
            dp->dc_name = (char *)calloc(1,strlen(pname)+1);
            if (dp->dc_name == NULL) {
                fprintf(stderr,"ls: out of memory\n");
                free(dp);
            }
            else {
                strcpy(dp->dc_name, pname);
                dp -> dc_next = dfirst;
                dfirst = dp;
            }
        }
    }
    if (lflg || sflg)
        curcol += printf("total %ld", tblocks);
    pem(&flist[lp],&flist[nfiles],lflg||sflg);
}

int main(int argc, char **argv)
{
    extern char *optarg;
    extern int  optind;
    int amino, opterr=0;
    int c;
    register struct lbuf *ep;
    struct  lbuf    lb;
    int i, width;
    long    time();
    char *malloc();
    void qsort(), exit();

malloc 在 stdlib.h 中声明为:

void *malloc(size_t size);

您的代码错误地将其重新声明为:

char *malloc();

删除错误的重新声明并仔细检查 malloc() 的使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM