Tag: c11

char数组可以与任何数据类型一起使用吗?

malloc()函数返回void*类型的指针。 它根据作为参数传递的size_t值以字节为单位分配内存。 生成的分配是原始字节,可以与C中的任何数据类型一起使用(无需转换)。 可以在返回void *的函数中声明类型为char的数组,可以与任何数据类型一起使用,例如生成的malloc分配吗? 例如, #include void *Stat_Mem(); int main(void) { //size : 10 * sizeof(int) int buf[] = { 1,2,3,4,5,6,7,8,9,10 }; int *p = Stat_Mem(); memcpy(p, buf, sizeof(buf)); for (int n = 0; n < 10; n++) { printf("%d ", p[n]); } putchar('\n'); return 0; } void *Stat_Mem() { static char Array[128]; return […]

C11匿名结构通过typedef?

C11标准中添加了匿名结构,所以 typedef struct { struct {int a, b}; int c; } abc_struct; 是有效和标准的。 使用typedef代替完整的struct声明是否也在标准范围内? 例如: typedef struct { int a, b; } ab_struct; typedef struct { ab_struct; int c; } abc_struct; GCC文档说这是Plan 9扩展,但它在我尝试过的少数编译器中工作(包括GCC ……)。 通过我对标准本身的阅读,我认为没关系,但这是一种容易搞砸的近距离阅读。

C11标准文档

从这个受SO保护的问题开始,我试图了解这些文件之间的区别: 9899 2012年成本$60 9899 2011年成本$265 正如你所看到的那些文件的价格差别很大,我不知道更便宜的文件是否有效,或者类似于真实标准的草稿或剪切副本。 有人买了INCITS吗? 编辑 正如@Chqrlie所指出的那样: 免费提供的ANSI和ISO官方文件与最终草案之间的区别是什么,可从官方网站 open-std.org/jtc1/sc22/wg14/www/docs/n1570 免费获取 。 PDF格式

c99和c11之间的差异

我正在学习c,现在。 我读的这本书是基于C99的。 我想在完成本书后将我的知识更新到C11,或者如果存在重大差异则更改资源。 因此,我要求的是更新我的知识的解释或资源。 我只发现了这个来源 。 然而,它似乎并不包含我需要或不简洁的信息。 提前致谢。 PS:我想学习C11,因为我认为它现在是普遍的标准。 如果没有,请通知我。

在C中编译多个类型的时间检查?

目前我有一个宏来检查一个值是一个类型。 #define CHECK_TYPE_INLINE(val, type) \ ((void)(((type)0) != (0 ? (val) : ((type)0)))) 在某些情况下,这对于能够对宏args进行类型检查很有用。 但是如果我要检查多种类型呢? 例如,检查它是否为struct Foo *或struct Bar * 。 例, static inline _insert_item(struct List *ls, void *item) { /* function body*/ } /* type-checked wrapper */ #define insert_item(ls, item) \ (CHECK_TYPE_ANY(item, struct Foo *, struct Bar *), \ _insert_item(ls, item)) 这有什么好方法吗?

C中的_Thread_local存储类说明符?

我在一本名为_Thread_local新标准C存储类中阅读了“ 如何编程7 ”一书中的注释: 新的C标准添加了存储类说明符_Thread_local ,这超出了本书的范围。 我在谷歌和这里寻找它,但没有出现。 有人可以给我一些关于它的链接吗?

未经validation的scanf调用会导致未定义的行为吗?

以下片段是否在发生错误时调用未定义的行为? #include int main() { int i; /* Indeterminate */ if (scanf(“%d”, &i) == 1) /* Initialize */ printf(“%d\n”, i); /* Success! Print read value */ else printf(“%d\n”, i); /* Input failed! Is printing `i` UB or not? */ return 0; } 如果scanf失败怎么办?是否访问了未初始化的变量? 编辑 此外,如果我用my_initializer(&i)替换scanf(“%d”, &i) my_initializer(&i) : int my_initializer(int *pi) { double room_temp_degc = […]

这是一个C11匿名结构吗?

我正在调查C11草案,它说 没有标记的结构类型的未命名成员称为匿名结构; 没有标记的联合类型的未命名成员称为匿名联合。 匿名结构或联合的成员被视为包含结构或联合的成员。 所以我构建了以下测试用例 // struct type with no tag typedef struct { unsigned char a; unsigned char b; // … Some other members … unsigned char w; } AToW; union { AToW; // <- unnamed member unsigned char bytes[sizeof(AToW)]; } myUnion; Clang和GCC都抱怨这名未透露姓名的成员,并表示该声明无效。 我做错了什么,或者他们根本不支持这个function?

可以在其定义中采用具有自动存储持续时间的变量的地址吗?

是否允许在其定义的右侧获取对象的地址,如下面的foo()所示: typedef struct { char x[100]; } chars; chars make(void *p) { printf(“p = %p\n”, p); chars c; return c; } void foo(void) { chars b = make(&b); } 如果它被允许,它的使用是否有任何限制,例如,打印它可以,我可以将它与另一个指针等进行比较吗? 在实践中,它似乎在我测试的编译器上进行编译,大部分时间都是预期的行为(但并非总是如此 ),但这远非保证。

过去数组对象的最后一个元素的基本原理是什么?

根据N1570(C11草案) 6.5.6/8 添加剂操作员 : 此外,如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向一个超过数组对象的最后一个元素 ,如果表达式Q指向一个超过数组对象的最后一个元素,表达式(Q)-1指向数组对象的最后一个元素 第6.5.6/9还包括: 此外,如果表达式P指向数组对象的元素或者指向数组对象的最后一个元素,并且表达式Q指向同一数组对象的最后一个元素,则表达式((Q)+1)-(P)具有与((Q)-(P))+1和-((P)-((Q)+1))的值,并且如果表达式P指向一个,则值为零即使表达式(Q)+1没有指向数组对象的元素,也是数组对象的最后一个元素。 106) 这certificate指针的算术是有效的: #include int main(void) { int a[3] = {0, 1, 2}; int *P, *Q; P = a + 3; // one past the last element Q = a + 2; // last element printf(“%td\n”, ((Q)+1)-(P)); printf(“%td\n”, ((Q)-(P))+1); printf(“%td\n”, -((P)-((Q)+1))); return 0; } 我希望不允许指向数组越界的元素,其取消引用作为未定义的行为(数组溢出),因此它使它具有潜在的危险性。 这有什么理由吗?