小编D.J*_*ind的帖子

如何解释C11标准第6.3.1.4节第1段(关于将float转换为unsigned int)

我的C11标准来自这里。这一段说:

\n
\n

当实浮点类型的有限值转换为_Bool以外的整数类型时,小数部分将被丢弃(即该值被截断为零)。如果整数部分的值不能用整数类型表示,则行为未定义。[61]

\n
\n

脚注 61 说:

\n
\n

当实浮点类型的值转换为无符号类型时,不需要执行整数类型的值转换为无符号类型时执行的余数运算。因此,可移植实浮点值的范围为(\xe2\x88\x921, U type _MAX +1)

\n
\n

我的困惑主要是关于unsigned int. 我目前的理解如下:

\n
float    a = 3.14;\nuint32_t b = (uint32_t)a; // defined, b == 3\n\nfloat    a = -1.23;\nuint32_t b = (uint32_t)a; // UB!\n\nfloat a = 2147483646.0;   // defined\nuint32_t b = (uint32_t)a; // defined, b == 2147483646\nuint8_t  c = (uint8_t )a;  // UB!\n
Run Code Online (Sandbox Code Playgroud)\n

它是否正确?

\n

c undefined-behavior language-lawyer

5
推荐指数
1
解决办法
169
查看次数

为什么我们不能拥有大的 VLA 并(部分)取代 malloc

通常,当我们事先不知道所需的大小时,我们使用 malloc() ,如下所示(删除检查/错误处理等):

FILE * fp = fopen(path, "rb");
fseek(fp, 0, SEEK_END);
ssize_t length = ftell(fp);
rewind(fp);
char* buffer = malloc(length * sizeof(char));
fread(buffer, 1, *length, fp);
fclose(fp);
free(buffer);
Run Code Online (Sandbox Code Playgroud)

我们需要使用char* buffer = malloc(length * sizeof(char));而不是char buffer[length];因为堆栈的大小非常有限。我的问题是,由于 C 支持可变长度数组,至少对于局部变量来说,是什么阻止我们使堆栈变得更大而只使用堆栈内存呢?

我确实在这里找到了答案。它提出了一个有效的观点:malloc有一个接口可以报告内存的不可用性。但这是唯一char* buffer = malloc(length * sizeof(char));;有效和char buffer[length];无效的原因吗?

让我总结一下评论/答案提出的一些观点:

  1. malloc()返回NULL表示分配失败,而VLA没有这种设计,所以只有系统内存耗尽时程序才会崩溃;
  2. 由于其本地作用域,我们无法将本地 VLA 从被调用者函数返回给调用者;
  3. 我们不能realloc()动态调整VLA的大小;
  4. VLA 不是 ISO C 标准中的必需功能,因此某些平台可能不支持它。

(但如上面的例子所示,在很多情况下,我们只是想要一个巨大的本地VLA,其大小在运行时已知,但一旦知道就永远不会改变。但我们仍然必须使用malloc()它)

编辑: 许多人发现问题的意图不清楚,“为什么这么麻烦而不只是使用 …

c

-1
推荐指数
1
解决办法
180
查看次数

标签 统计

c ×2

language-lawyer ×1

undefined-behavior ×1