相关疑难解决方法(0)

size_t vs. uintptr_t

C标准保证这size_t是一种可以保存任何数组索引的类型.这意味着,逻辑上,size_t应该能够保存任何指针类型.我在Googles上发现的一些网站上看到这是合法的和/或应该始终有效:

void *v = malloc(10);
size_t s = (size_t) v;
Run Code Online (Sandbox Code Playgroud)

那么在C99中,标准引入了intptr_tuintptr_t类型,它们是有符号和无符号类型,保证能够保存指针:

uintptr_t p = (size_t) v;
Run Code Online (Sandbox Code Playgroud)

那么使用size_t和有uintptr_t什么区别?两者都是无符号的,并且两者都应该能够保存任何指针类型,因此它们在功能上看起来相同.除了清晰度之外,是否有任何真正令人信服的理由uintptr_t(或者更好的是,a void *)而不是a size_t?在一个不透明的结构中,字段只能由内部函数处理,有没有理由不这样做?

出于同样的原因,ptrdiff_t一直是一个能够保持指针差异的签名类型,因此能够容纳大多数指针,那么它与它intptr_t有何区别?

是不是所有这些类型基本上都服务于同一功能的不同版本?如果没有,为什么?对于其中一个我不能用另一个做什么我不能做什么?如果是这样,为什么C99会在语言中添加两种基本上多余的类型?

我愿意忽略功能指针,因为它们不适用于当前的问题,但随意提及它们,因为我有一种潜在的怀疑,它们将成为"正确"答案的核心.

c pointers size-t

245
推荐指数
5
解决办法
6万
查看次数

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

我和这个答案的印象相同,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
查看次数

C中数组的最大大小是多少?

我知道硬件将限制程序执行期间分配的内存量.但是,我的问题是不考虑硬件.假设内存量没有限制,那么阵列没有限制吗?

c arrays

45
推荐指数
4
解决办法
12万
查看次数

标签 统计

c ×3

size-t ×2

arrays ×1

gcc ×1

mingw ×1

pointers ×1

stdint ×1