对 C 中的这个语句感到困惑?

标签 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();

真的很奇怪吗?

最佳答案

 char *p, *malloc();

正在声明一个指向 char 的指针名为 p和一个名为 malloc 的函数(在这些 K&R C 的日子里,void* 不存在)。

这是老 Kernigan & Ritchie C (从 1980 年代开始)。从那时起,C 标准有了显着的发展。当前的 C 标准是 C11 , 及其之前的版本 C99应用非常广泛。

今天不要这样写代码。 malloc<stdlib.h> 中定义可能是一些 inlined function有(但通常没有)。

您的函数通常按惯例称为 xmalloc今天;你需要添加

#include <stdlib.h>
#include <stdio.h>

在文件的开头(因为 mallocexit<stdlib.h> 中声明,EXIT_FAILURE 在那里定义,并且 perror<stdio.h> 中声明),并且会被定义为

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

并在你的一些 header 中声明

 void* xmalloc(size_t sz);

我建议阅读一本较新的书。在 Linux 上,至少考虑 Advanced Linux Programming书(2001 年出版)。

如果使用 GCC,您可以添加 function attributes到你的函数声明。

关于对 C 中的这个语句感到困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21250216/

相关文章:

c - 如何在 C 中的嵌套结构中创建指向变量的指针?

C99 特定的 scanf 说明符不适用于 GCC 3.3.2——为什么不呢?

c - 在 C 中,如果 B 是易变的,表达式 (void)(B = 1) 应该读作 B

c - 有没有文献证明 printf 的 %f 将 float 转换为 double?

c - C中不完整类型和对象类型的定义是什么?

c - 我应该使用 ANSI C (C89) 吗?

用于获取 JPEG 图像大小的 C++ 库

html - 能用C输出图片吗?

c - C 中 memcpy 的最佳实践

使用 scanf() 检查 C 中的用户输入