做的有什么区别:
ptr = (char **) malloc (MAXELEMS * sizeof(char *));
Run Code Online (Sandbox Code Playgroud)
要么:
ptr = (char **) calloc (MAXELEMS, sizeof(char*));
Run Code Online (Sandbox Code Playgroud)
什么时候使用calloc而不是malloc是一个好主意,反之亦然?
我和这个答案的印象相同,size_t标准总是保证足够大以容纳给定系统的最大可能类型.
但是,此代码无法在gcc/Mingw上编译:
#include <stdint.h>
#include <stddef.h>
typedef uint8_t array_t [SIZE_MAX];
Run Code Online (Sandbox Code Playgroud)
错误:数组'array_t'的大小太大
我在这里误解了标准中的某些内容吗?被size_t允许为给定的实现是否过大?或者这是Mingw的另一个错误?
编辑:进一步的研究表明
typedef uint8_t array_t [SIZE_MAX/2]; // does compile
typedef uint8_t array_t [SIZE_MAX/2+1]; // does not compile
Run Code Online (Sandbox Code Playgroud)
这恰好是相同的
#include <limits.h>
typedef uint8_t array_t [LLONG_MAX]; // does compile
typedef uint8_t array_t [LLONG_MAX+(size_t)1]; // does not compile
Run Code Online (Sandbox Code Playgroud)
所以我现在倾向于认为这是Mingw中的一个错误,因为根据有符号整数类型设置最大允许大小没有任何意义.
我在 C11 标准中没有找到任何说明字符串不能长于SIZE_MAX(其中SIZE_MAX表示size_t类型的最大值)字符的内容。例如,如果size_max是long,并且在我的实现中有一个long long严格大于的类型long,那么我可以使用long long.
然而,这将意味着一些不寻常的情况:strlen例如,可能无法返回字符串的实际大小,因为结果将size_t在最后转换为,因此长度的字符串SIZE_MAX+1将被报告为大小为 0,对于实例。例如,这是否会违反标准,从而阻止此类字符串的存在?作为参考,7.24.6.3 只说:
7.24.6.3 strlen 函数
概要
#include <string.h>
size_t strlen(const char *s);描述
strlen 函数计算 s 指向的字符串的长度。
退货
strlen 函数返回终止空字符之前的字符数。
我错过了什么,或者这在(给定的符合标准的实现)C11 中是完全有效的吗?
是否size_t保证足够大以表示任何类型的大小?根据此参考:
size_t可以存储任何类型(包括数组)的理论上可能存在的对象的最大大小。
通常,这是一个可靠的参考,但我在标准的相关部分中找不到任何证明或质疑此主张的内容。