在C中对这个陈述的困惑?

时间:2014-01-21 05:55:05

标签: c c99

我在The UNIX Programming Environment(版权日期为1984年发布)中找到了此代码块。

chp8-> hoc3-> symbol.c

char *emalloc(n)    /* check return from malloc */
unsigned n;
{
char *p, *malloc();

p = malloc(n);
if (p == 0)
    execerror("out of memory", (char *) 0);
return p;
}

含义是什么:

char *p, *malloc();

真的很奇怪?

2 个答案:

答案 0 :(得分:3)

 char *p, *malloc();

声明指向名为char的{​​{1}}和名为p的函数的指针(在这些K& R C天中,malloc不存在)。

这是老Kernigan&里奇C(从20世纪80年代开始)。从那时起,C标准发生了重大变化。当前的C标准是C11,其先前版本C99被广泛使用。

今天不要这样编码。 void*中定义了malloc,而<stdlib.h>可能会xmalloc(但通常不是)。

您的功能通常在今天被称为#include <stdlib.h> #include <stdio.h> ;你需要添加

malloc

在您的文件开头(exit<stdlib.h>EXIT_FAILURE中声明,perror在那里定义,<stdio.h>在{ {1}}),并且已被定义为

 void* xmalloc(size_t sz) {
    void* p = malloc(sz);
    if (!p) {
       perror("malloc");
       exit(EXIT_FAILURE);
    };
    return p;
 }

并在你的某些标题中用

声明
 void* xmalloc(size_t sz);

我建议你阅读一本新书。在Linux上,至少考虑inlined function本书(自2001年开始)。

如果使用GCC,您可以在函数声明中添加Advanced Linux Programming

答案 1 :(得分:2)

大多数混淆来自使用旧书,它使用非常旧的C版本(称为K&R C)。我会列出它们

<强> 1。标准函数不必要地声明

char *p, *malloc();

可以分解为

char *p;
char *malloc();

后者声明了一个名为malloc的函数,它返回一个char*,没有关于它所采用的参数类型的信息。在现代C(C11C99甚至是C89)中,你会做

#include <stdlib.h>

并开始使用malloc,而不必担心其声明,void* malloc(size_t size);来自包含的标题。

<强> 2。使用的函数声明和定义是陈旧的

假设您有一个函数来添加两个整数,根据您的旧书,它会将其声明为int add();(或者根本不会声明它,因为默认类型被视为未声明时int并将其定义为

 int add(x, y)
    int x;
    int y;
 {
    return x + y;
 }

在现代C中,您可以将其声明为int add(int, int);并将其定义为

 int add(int x, int y)
 {
     return x + y;
 }

这些是标准化的,称为ANSI C ISO C C89 (非正式)。 K&R's C book有两个版本,旧版本的版本与您的图书有相同的问题;因此建议使用在ANSI C上编写的第2版。