我在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();
真的很奇怪?
答案 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(C11或C99甚至是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版。