相关疑难解决方法(0)

malloc和calloc之间的区别?

做的有什么区别:

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是一个好主意,反之亦然?

c malloc calloc

743
推荐指数
13
解决办法
51万
查看次数

为什么数组的最大大小"太大"?

我和这个答案的印象相同,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中的一个错误,因为根据有符号整数类型设置最大允许大小没有任何意义.

c gcc mingw size-t stdint

56
推荐指数
3
解决办法
9743
查看次数

符合标准的字符串可以长于 SIZE_MAX 个字符吗?

我在 C11 标准中没有找到任何说明字符串不能长于SIZE_MAX(其中SIZE_MAX表示size_t类型的最大值)字符的内容。例如,如果size_maxlong,并且在我的实现中有一个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 中是完全有效的吗?

c string language-lawyer c11

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

size_t是否足够大以表示任何类型的大小?

是否size_t保证足够大以表示任何类型的大小?根据参考:

size_t 可以存储任何类型(包括数组)的理论上可能存在的对象的最大大小。

通常,这是一个可靠的参考,但我在标准的相关部分中找不到任何证明或质疑此主张的内容。

c size-t language-lawyer

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

标签 统计

c ×4

language-lawyer ×2

size-t ×2

c11 ×1

calloc ×1

gcc ×1

malloc ×1

mingw ×1

stdint ×1

string ×1