相关疑难解决方法(0)

为什么将 free 的返回值转换为 void?

我正在阅读一本使用 C的书(Butenhof 的POSIX 线程编程,1997 年),我遇到了以下行:

(void)free(data);
Run Code Online (Sandbox Code Playgroud)

这里,data只是一个指向已分配结构的指针,

data = malloc(sizeof(my_struct_t));
Run Code Online (Sandbox Code Playgroud)

为什么是free被强制转换的结果void

根据我对 C 的理解,这似乎没有意义,原因有两个:

  • free 函数已经返回 void
  • 代码没有使用返回值(它甚至没有被分配给一个变量)

这本书写于 1997 年。这是某种遗产吗?

作者提到这些示例是在 Digital Unix 4.0d 上运行的,但如果您不打算使用该结果,我仍然无法想象有理由强制转换该函数的结果。

c free casting legacy-code void

84
推荐指数
3
解决办法
7053
查看次数

C/C++中的无限循环

有几种可能性来进行无限循环,这里有一些我会选择:

  • for(;;) {}
  • while(1) {}/while(true) {}
  • do {} while(1)/do {} while(true)

是否有某种形式应该选择?现代编译器是否会在中间和最后一个语句之间产生影响,或者它是否意识到它是一个无限循环并完全跳过检查部分?

编辑:因为已经提到我忘记了goto,但这是因为我根本不喜欢它作为一个命令.

Edit2:我对从kernel.org获取的最新版本做了一些grep.我确实看起来随着时间的推移没有太大变化(至少在内核中) 在此输入图像描述

c c++ loops infinite-loop

57
推荐指数
7
解决办法
9万
查看次数

C中限制性最强的类型是什么意思?

" C编程语言 "一书在第8.7节" 实例 - 存储分配器 "中讨论了"限制性最强的类型" :

虽然机器各不相同,但每台机器都有一个限制性最强的类型:如果限制性最强的类型可以存储在特定地址,则所有其他类型也可以.在某些机器上,限制最多的类型是a double; 在别人身上,int或是long足够的.

在他们的代码中,union header使用类型对齐long.

限制性最强的是什么意思?它可能是最大的类型(例如double),还是有另一种方法?

c architecture malloc memory-alignment long-integer

12
推荐指数
2
解决办法
1207
查看次数

与K&R实施malloc混淆

我一直在阅读K&R,并在实施malloc()包含时遇到了一些困惑.

typedef long Align; /* for alignment to long boundary */

union header { /* block header */
  struct {
    union header *ptr; /* next block if on free list */
    unsigned size; /* size of this block */
  } s;
  Align x; /* force alignment of blocks */
};
typedef union header Header;

static Header base; /* empty list to get started */
static Header *freep = NULL; /* start of free list */

void *malloc(unsigned nbytes) …
Run Code Online (Sandbox Code Playgroud)

c malloc kernighan-and-ritchie

8
推荐指数
1
解决办法
630
查看次数

argc在C程序中给出错误的值

我想在运行时输入一些命令行参数.喜欢

./program abc def ghi
Run Code Online (Sandbox Code Playgroud)

argc在这种情况下将是4.没问题.但如果我这样做

./program abc def *
Run Code Online (Sandbox Code Playgroud)

甚至

./program * abc def
Run Code Online (Sandbox Code Playgroud)

变量argc给我一个远大于4的值.

在打印整个argv数组(不考虑第0个参数; ./program)作为字符串时,我会得到一个列表,其中前两个元素是abc,def而其他元素都是工作目录中包含的文件的文件名.

我正在尝试从K&R学习C语言.我试图制作一个RPN计算器,我们可以给出类似的表达式./program 2 4 *.

这是什么原因?或者我错了?

c shell argc osx-mavericks

3
推荐指数
1
解决办法
194
查看次数