Tag: c99

使用灵活的数组成员分配struct

这是C99代码: typedef struct expr_t { int n_children; foo data; // Maybe whatever type with unknown alignment struct expr_t *children[]; } expr_t; 现在,我该如何分配内存? expr_t *e = malloc (sizeof (expr_t) + n * sizeof (expr_t *)); 要么 expr_t *e = malloc (offsetof (expr_t, children) + n * sizeof (expr_t *)); ? sizeof甚至可以保证在具有灵活arrays成员的类型上工作(GCC接受它)吗?

为什么SCHAR_MIN在C99中定义为-127?

C99的5.2.4.2.1将SCHAR_MIN定义为-127,将SCHAR_MAX定义为127. 8位有符号整数的范围不应该是-128到+127吗? 我的编译器的limits.h将SCHAR_MIN定义为(-1 << ((CHAR_BIT)-1)) ,如果CHAR_BIT为8,则为-128。 是否有任何理由为什么SCHAR_MIN被定义为-127而不是-128?

printf / fprintf根据c99的最大尺寸

C99 标准说: 任何单次转换可以产生的字符数应至少为4095 这是否意味着最大尺寸是4095,如果是,为什么它说“至少”?

如何在C99中为隐式定义的多维数组分配内存?

我正在尝试编写一个C99程序,我有一个隐式定义的字符串数组: char *stuff[] = {“hello”,”pie”,”deadbeef”}; 由于未定义数组维度,因此为每个字符串分配了多少内存? 是否所有字符串都分配了与定义中最大字符串相同数量的元素? 例如,以下代码是否等同于上面的隐式定义: char stuff[3][9]; strcpy(stuff[0], “hello”); strcpy(stuff[1], “pie”); strcpy(stuff[2], “deadbeef”); 或者每个字符串只分配定义时所需的内存量(即stuff[0]包含6个元素的数组, stuff[1]包含4个元素的数组, stuff[2]包含一个数组9个元素)?

如何将字符串解析为C中的日期时间结构?

我想将一个字符串(char *)解析为C中的tm结构。是否有任何内置函数可以做到这一点? 我指的是C99标准中的ANSI C.

C99 – 为什么假和真的定义为0和1而不是((bool)0)和((bool)1)?

偶然发现了一个失败的断言,因为它将false与函数的返回类型进行比较,因为函数本身返回了一个bool并且断言不仅检查了值,而且还检查了返回值的类型以匹配false,保证,返回一个bool。 现在的问题是,C99将bool定义为_Bool,_Bool甚至不一定与int相同(实际上,根据我的经验,在现今的大多数平台上它通常与unsigned char相同),不要谈论相同type(实际上这是不可能的,因为_Bool是C99中语言的内置类型),但是将false和true定义为0和1而没有任何类型转换和没有类型转换的预处理器定义将默认为int。 如果C99改为将false和true定义为((bool)0)和((bool)1),它们将始终是bool类型,无论如何定义_Bool。 那么有没有什么好的理由让它们总是被定义为int,即使bool不是那个平台上的int,或者这只是语言中的一个bug,应该用C1x修复?

变量被遮蔽时收到警告

我通常想避免这样的代码: #include int main(int argc, char *argv[]){ int n = 3; for (int n = 1; n <= 10; n++){ printf("%d\n", n); } printf("%d\n", n); } 我怎样才能找到变量的这种用法? 这意味着,在同一函数中,“更本地”变量与更全局变量具有相同的名称? C标准:C 99

无符号位域的类型:int或unsigned int

C99标准的第6.3.1.1节包含: 如果可以使用int或unsigned int则可以在表达式中使用以下内容: […] _Bool , int , signed int或unsigned int类型的位字段。 如果int可以表示原始类型的所有值,则该值将转换为int ; 否则,它将转换为unsigned int 。 在我看来,这意味着unsigned int位字段被提升为int ,除非无符号位字段的宽度等于int的宽度,在这种情况下最后一个短语适用。 我有以下程序: struct S { unsigned f:32; } x = { 28349}; unsigned short us = 0xDC23L; main(){ int r = (xf ^ ((short)-87)) >= us; printf(“%d\n”, r); return r; } 还有两个系统来执行这个程序( int在两个系统上都是32位)。 一个系统说这个程序打印1,另一个系统说它打印0.我的问题是,我应该在哪两个系统中提交错误报告? (我倾向于针对打印0的系统提交报告,因为上面的摘录)

struct中间的可变长度数组 – 为什么这个C代码对gcc有效

使用VLA(可变长度数组)有一些奇怪的代码,它被gcc 4.6视为有效C(C99,C11): $ cat ac int main(int argc,char**argv) { struct args_t{ int a; int params[argc]; // << Wat? // VLA in the middle of some struct, between other fields int b; } args; args.b=0; for(args.a=0;args.a<argc;args.a++) { args.params[args.a]=argv[0][0]; args.b++; } return args.b; } 编译时此代码没有警告: $ gcc-4.6 -Wall -std=c99 ac && echo $? 0 $ ./a.out ; […]

为什么允许多次声明typedef标识符?

从C99标准来看,6.7(5): 声明指定一组标识符的解释和属性。 标识符的定义是该标识符的声明:对于对象,导致为该对象保留存储; 对于一个function,包括function体; 对于枚举常量或typedef名称,是标识符的(唯一)声明。 如果带有typedef标识符实际上是定义,那么为什么允许它们被多次声明? 例: int main() { typedef int x; typedef int x; } 以上程序编译没有错误。 这怎么可能? 我期待该程序给我一个多重定义错误。