我想声明一个函数,返回一个指向相同types的函数的指针。 我想用它来实现像下面这样的状态机: typedef event_handler_t (*event_handler_t)(event_t*); // compilation error event_handler_t state2(event_t* e); event_handler_t state1(event_t* e) { switch(e->type) { //… case SOME_EVENT: return state2; //… } } event_handler_t state2(event_t* e) { switch(e->type) { //… case OTHER_EVENT: return state1; //… } } //… event_handler_t event_handler; //… event_handler(&e); //… 我设法解决使用结构的compliation错误,如下所示: typedef struct event_handler { struct event_handler (*func)(event_t *); } […]
ANSI(C89 / 90)C中是否有标准投诉方法来表示字节? 我知道,通常情况下,字符恰好是一个字节,但我的理解是,这并不能保证是这样的。 另外,在C99标准中有stdint.h,但在C99之前使用了什么? 我对8位特别感兴趣,还有一个“字节”(sizeof(x)== 1)。
我似乎记得,当模运算符的操作数是负数(只是它应该是一致的)时,ANSI C没有指定应该返回什么值。 它是后来指定,还是总是指定,我记得不正确?
为了达到真正的标准,C语言中的所有函数(main函数除外)都有一个原型,即使它们只在被定义在同一个翻译单元之后才被使用?
例如, int result; result = 125/100; 要么 result = 43/100; 结果总会是师的底线吗? 什么是定义的行为?
我所问的是众所周知的“结构的最后一个成员具有可变长度”的技巧。 它是这样的: struct T { int len; char s[1]; }; struct T *p = malloc(sizeof(struct T) + 100); p->len = 100; strcpy(p->s, "hello world"); 由于结构在内存中的布局方式,我们可以将结构覆盖在一个大于所需块的地方,并将最后一个成员视为大于指定的1 char 。 所以问题是: 这种技术在技术上是不确定的行为? 。 我希望是这样,但是很奇怪这个标准是怎么说的。 PS:我知道C99的方法,我希望答案专门针对上面列出的技巧的版本。
编辑:我已经添加了该示例的源代码。 我遇到这个例子 : char source[MAX] = "123456789"; char source1[MAX] = "123456789"; char destination[MAX] = "abcdefg"; char destination1[MAX] = "abcdefg"; char *return_string; int index = 5; /* This is how strcpy works */ printf("destination is originally = '%s'\n", destination); return_string = strcpy(destination, source); printf("after strcpy, dest becomes '%s'\n\n", destination); /* This is how strncpy works */ […]