Questions tagged «c»

C是用于系统编程(OS和嵌入式),库,游戏和跨平台的通用编程语言。该标记应与ISO 9899标准(除非另有说明,最新版本9899:2018中定义的有关C语言的一般问题)一起使用-还要使用c89,c99,c11等标记特定于版本的请求。C与C ++截然不同,在没有合理理由的情况下,不应将其与C ++标记结合使用。

12
函数指针,闭包和Lambda
我现在正在学习函数指针,当我阅读有关该主题的K&R章节时,打动我的第一件事是:“嘿,这有点像闭包。” 我知道这个假设在某种程度上根本上是错误的,并且在网上搜索之后,我没有发现对此比较的任何分析。 那么,为什么C风格的函数指针与闭包或lambda基本不同?据我所知,这与以下事实有关:函数指针仍指向已定义(命名)的函数,而不是匿名定义函数的做法。 为什么在第二种情况下将函数传递给未命名的函数比在第一种情况下传递的只是普通的日常函数更强大? 请告诉我如何以及为什么如此紧密地比较两者是错误的。 谢谢。

3
与平台无关的size_t在c中的格式说明符?
我想打印出size_tC中类型的变量,但它似乎size_t是别名,它是不同体系结构上的不同变量类型。例如,在一台计算机(64位)上,以下代码不会引发任何警告: size_t size = 1; printf("the size is %ld", size); 但是在我的另一台计算机(32位)上,以上代码会产生以下警告消息: 警告:格式'%ld'期望类型为'long int *',但是参数3的类型为'size_t *' 我怀疑这是由于指针大小的差异所致,因此在我的64位计算机size_t上别名为long int("%ld"),而在我的32位计算机size_t上别名为另一种类型。 是否有专门用于格式的说明符size_t?



6
具体来说,强制转换malloc结果有什么危险?
现在,在人们开始将其标记为重复项之前,我已经阅读了以下所有内容,但没有一个提供我所寻找的答案: C FAQ:强制转换malloc的返回值怎么了? SO:我应该显式转换malloc()的返回值吗? SO:C中不必要的指针广播 SO:我是否强制转换malloc的结果? C FAQ和上述问题的许多答案都引用了一个神秘的错误,该错误malloc会隐藏cast的返回值。但是,它们都没有在实践中给出此类错误的具体示例。现在注意我说的是错误,不是警告。 现在给出以下代码: #include <string.h> #include <stdio.h> // #include <stdlib.h> int main(int argc, char** argv) { char * p = /*(char*)*/malloc(10); strcpy(p, "hello"); printf("%s\n", p); return 0; } 在使用gcc 4.2和不使用强制类型转换的情况下编译上述代码会给出相同的警告,并且程序在两种情况下均会正确执行并提供相同的结果。 anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc nostdlib_malloc.c: In function ‘main’: nostdlib_malloc.c:7: warning: incompatible implicit …
86 c 

7
如何避免在信号处理程序中使用printf?
由于printf不是可重入的,因此在信号处理程序中使用它并不安全。但是我看过很多使用printf这种方式的示例代码。 所以我的问题是:我们什么时候需要避免printf在信号处理程序中使用,并且有推荐的替代品吗?
86 c  linux  signals 

30
为什么要用汇编编程?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 去年关闭。 改善这个问题 我对那里所有的核心低级黑客都有疑问。我在博客中碰到了这句话。我并不真正认为消息来源很重要(如果您真的很在意,那就是Haack),因为这似乎是一种常见的说法。 例如,许多现代的3D游戏都有以C ++和Assembly编写的高性能核心引擎。 就汇编而言,这是用汇编语言编写的,因为您不希望编译器发出额外的指令或使用过多的字节,或者您使用的是无法在C中表达的更好的算法(或者在没有编译器迷惑了他们)? 我完全明白了解底层内容很重要。我只想理解为什么理解汇编后的程序。

7
C标准是否将真值明确表示为0或1?
我们知道,任何不等于的数字0都被视为trueC,因此我们可以这样写: int a = 16; while (a--) printf("%d\n", a); // prints numbers from 15 to 0 但是,我想知道是否在C中将true / false定义为1/ 0,所以我尝试了以下代码: printf("True = %d, False = %d\n", (0 == 0), (0 != 0)); // prints: True = 1, False = 0 不C标准明确指示的真正的真值和假的1和0分别?
86 c 





5
在C语言中,长的printf语句可以分成多行吗?
我有以下声明: printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", sp->name, sp->args, sp->value, sp->arraysize); 我想分手。我尝试了以下操作,但不起作用。 printf("name: %s\t args: %s\t value %d\t arraysize %d\n", sp->name, sp->args, sp->value, sp->arraysize); 我该如何分解?
86 c  printf 

29
“做…当”与“当”
可能的重复项: While vs. While While 什么时候应该使用do-while而不是while循环? 我现在已经编程了一段时间(2年的工作+ 4.5年的学位+ 1年的大学预科),而且我从来没有使用过do-while循环,除非在编程入门课程中被迫这样做。如果我从未遇到过如此根本的事情,我会感到越来越错误。 难道我只是没有遇到正确的情况? 有哪些示例需要使用“做一会儿”而不是“一会儿”? (我的教育几乎都是用C / C ++进行的,而我的工作是使用C#的,因此,如果存在另一种语言绝对有意义,因为工作时间不同,那么这些问题就不适用了。) 为了澄清...我知道awhile和a之间的区别do-while。While检查退出条件,然后执行任务。do-while执行任务,然后检查退出条件。
86 c#  c++  c  while-loop  do-while 

10
将数组作为参数传递给C中的函数
我编写了一个包含数组作为参数的函数,并通过如下传递数组的值来调用它。 void arraytest(int a[]) { // changed the array a a[0]=a[0]+a[1]; a[1]=a[0]-a[1]; a[0]=a[0]-a[1]; } void main() { int arr[]={1,2}; printf("%d \t %d",arr[0],arr[1]); arraytest(arr); printf("\n After calling fun arr contains: %d\t %d",arr[0],arr[1]); } 我发现的是,尽管我arraytest()通过传递值(原始的副本)来调用函数int arr[]已更改。 你能解释为什么吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.