我的C11标准来自这里。这一段说:
\n\n\n当实浮点类型的有限值转换为_Bool以外的整数类型时,小数部分将被丢弃(即该值被截断为零)。如果整数部分的值不能用整数类型表示,则行为未定义。[61]
\n
脚注 61 说:
\n\n\n当实浮点类型的值转换为无符号类型时,不需要执行整数类型的值转换为无符号类型时执行的余数运算。因此,可移植实浮点值的范围为(\xe2\x88\x921, U type _MAX +1)
\n
我的困惑主要是关于unsigned int. 我目前的理解如下:
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!\nRun Code Online (Sandbox Code Playgroud)\n它是否正确?
\n通常,当我们事先不知道所需的大小时,我们使用 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];无效的原因吗?
让我总结一下评论/答案提出的一些观点:
malloc()返回NULL表示分配失败,而VLA没有这种设计,所以只有系统内存耗尽时程序才会崩溃;realloc()动态调整VLA的大小;(但如上面的例子所示,在很多情况下,我们只是想要一个巨大的本地VLA,其大小在运行时已知,但一旦知道就永远不会改变。但我们仍然必须使用malloc()它)
编辑: 许多人发现问题的意图不清楚,“为什么这么麻烦而不只是使用 …