Questions tagged «c»

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

2
UNIX域套接字VS命名管道?
在查看了一个名为socket的Unix之后,我以为它们被命名为管道。我看着名字管道,并没有发现很大的不同。我看到它们的初始化方式有所不同,但这就是我唯一注意到的事情。两者都使用C写入/读取功能,并且类似于AFAIK。 UNIX域套接字和命名管道有什么区别?我什么时候可以选一个?我应该默认使用哪个(例如,我在C ++中默认使用vector而不是使用双端队列,列表或其他需要的东西)?
122 c  linux 

3
是否使用if(0)跳过应该起作用的开关中的情况?
我有一种情况,我希望C ++ switch语句中的两种情况都落入第三种情况。具体而言,第二种情况将落入第三种情况,并且第一种情况也将落入第三种情况而不会通过第二种情况。 我有一个愚蠢的想法,尝试了一下,就成功了!我把第二个盒子包裹在一个if (0) {...中}。看起来像这样: #ifdef __cplusplus # include <cstdio> #else # include <stdio.h> #endif int main(void) { for (int i = 0; i < 3; i++) { printf("%d: ", i); switch (i) { case 0: putchar('a'); // @fallthrough@ if (0) { // fall past all of case 1 …

8
尾递归如何工作?
我几乎了解尾递归的工作原理以及它与普通递归之间的区别。我只是不明白为什么它不要求堆栈来记住它的返回地址。 // tail recursion int fac_times (int n, int acc) { if (n == 0) return acc; else return fac_times(n - 1, acc * n); } int factorial (int n) { return fac_times (n, 1); } // normal recursion int factorial (int n) { if (n == 0) return 1; …

13
在O(n)时间和O(1)空间中查找重复项
输入:给定n个元素组成的数组,其中包含从0到n-1的元素,这些数字中的任何一个都出现多次。 目标:在O(n)中查找这些重复数字,并且仅使用恒定的存储空间。 例如,假设n为7,数组为{1、2、3、1、3、0、6},答案应该为1和3。我在这里检查了类似的问题,但答案使用了诸如HashSetetc之类的一些数据结构。 有没有相同的有效算法?
121 c++  c  algorithm 

23
什么是教育工具能够证明人们在C / C ++中所做的不必要的假设?
我想为SO准备一些教育工具,该工具应帮助初学者(和中级)程序员认识和挑战C,C ++及其平台中的不必要假设。 例子: “整数环绕” “每个人都有ASCII” “我可以将函数指针存储在void *中” 我认为一个小的测试程序可以在各种平台上运行,这些平台运行“合理”的假设,这些假设是根据我们在SO方面的经验,通常由许多没有经验/半经验的主流开发人员做出的,并记录了它们在不同机器上的破坏方式。 这样做的目的不是要证明做某事是“安全的”(这是不可能做到的,测试如果失败就只能证明任何事情),而是向即使是最不懂事的人也演示最不起眼的表情如果其他计算机具有未定义或实现定义的行为,则在另一台计算机上中断。。 为此,我想问你: 如何改善这个想法? 哪些测试将是好的,它们应该是什么样? 您是否可以在可以使用的平台上运行测试并发布结果,以便最终获得平台数据库,它们之间的差异以及为何允许这种差异? 这是测试玩具的当前版本: #include <stdio.h> #include <limits.h> #include <stdlib.h> #include <stddef.h> int count=0; int total=0; void expect(const char *info, const char *expr) { printf("..%s\n but '%s' is false.\n",info,expr); fflush(stdout); count++; } #define EXPECT(INFO,EXPR) if (total++,!(EXPR)) expect(INFO,#EXPR) /* stack check..How …


21
为什么地址零用于空指针?
在C(或C ++)中,如果指针的值为零,则它是特殊的:建议释放它们的内存后将指针设置为零,因为这意味着再次释放该指针并不危险;当我调用malloc时,如果无法获取内存,它将返回一个值为零的指针;我if (p != 0)一直在确保传递的指针有效,等等。 但是由于内存寻址从0开始,难道不是0像其他地址一样有效吗?在这种情况下,如何使用0来处理空指针?为什么负数不为null? 编辑: 一堆好答案。我将总结一下我的内心理解后所表达的答案中的内容,并希望如果我误会,社区会纠正我。 像编程中的所有其他内容一样,它是一种抽象。只是一个常数,与地址0无关。C++ 0x通过添加关键字来强调这一点nullptr。 它甚至不是地址抽象,它是C标准所指定的常数,并且编译器可以将其转换为其他数字,只要确保它永远不等于“真实”地址即可,如果0不等于,则等于其他空指针。平台使用的最佳价值。 如果不是早期的抽象,那么系统将使用地址0,而程序员无法使用该地址。 我承认,我的负面建议是有点疯狂的头脑风暴。如果对地址使用带符号的整数会造成一点浪费,这意味着除了空指针(-1或其他值)以外,值空间在构成有效地址的正整数和刚刚浪费的负数之间平均分配。 如果任何数字始终可以用数据类型表示,那么它就是0。(可能也是1。我认为一位整数(如果是无符号的,则为0或1),或者如果签名则只是有符号的位,或者是两位整数将会是[-2,1]。但是您可以将0设为null,将1设为内存中唯一可访问的字节。) 我脑子里仍然有一些未解决的事情。指向特定固定地址的堆栈溢出问题指针告诉我,即使空指针的0为抽象,也不一定需要其他指针值。这导致我发布了另一个堆栈溢出问题,我是否想访问地址零?。
121 c++  c  memory  pointers 

6
套接字connect()vs bind()
两者connect()和bind()系统调用都将套接字文件描述符“关联”到一个地址(通常是ip /端口组合)。他们的原型是: int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 和 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 2个通话之间的确切区别是什么?什么时候应该使用connect(),什么时候使用bind()? 具体来说,在一些示例服务器客户端代码中,发现客户端正在使用connect()并且服务器正在使用该bind()调用。原因对我来说还不是很清楚。

3
C / C ++宏字符串串联
#define STR1 "s" #define STR2 "1" #define STR3 STR1 ## STR2 是否可以串联STR3 ==“ s1”?您可以通过将args传递给另一个Macro函数来实现。但是有直接的方法吗?
121 c++  c  c-preprocessor 

5
为什么C ++ 11不支持指定的初始化列表作为C99?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 2年前关闭。 改善这个问题 考虑: struct Person { int height; int weight; int age; }; int main() { Person p { .age = 18 }; } 上面的代码在C99中合法,但在C ++ 11中不合法。 什么是 C ++ 11 标准委员会排除支持此类方便功能的理由?
121 c++  c  c++11  initialization  c99 



6
为什么需要.bss段?
我知道的是,全局变量和静态变量存储在.data段中,而未初始化的数据存储在.bss段中。我不明白的是,为什么我们有专用于未初始化变量的段?如果未初始化的变量在运行时分配了值,那么该变量是否.bss仅仍存在于段中? 在以下程序中, a在.data段中,并且b在.bss段中;那是对的吗?如果我的理解是错误的,请纠正我。 #include <stdio.h> #include <stdlib.h> int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9}; int b[20]; /* Uninitialized, so in the .bss and will not occupy space for 20 * sizeof (int) */ int main () { ; } 另外,请考虑以下程序, #include <stdio.h> #include <stdlib.h> …

7
转换为int vs floor
这些之间有什么区别: float foo1 = (int)(bar / 3.0); float foo2 = floor(bar / 3.0); 据我了解,两种情况都有相同的结果。编译后的代码有什么区别吗?
120 c++  c  floating-point 

13
使用C或C ++打印调用堆栈
每当调用某个函数时,是否有任何方法可以在C或C ++的运行进程中转储调用堆栈?我想到的是这样的: void foo() { print_stack_trace(); // foo's body return } Where的print_stack_trace工作方式与callerPerl 类似。 或类似这样的东西: int main (void) { // will print out debug info every time foo() is called register_stack_trace_function(foo); // etc... } 在其中register_stack_trace_function放置某种内部断点,该断点将在每次foo调用时打印堆栈跟踪。 某些标准C库中是否存在类似的内容? 我正在使用GCC在Linux上工作。 背景 我有一个测试运行,该行为基于一些不应影响此行为的命令行开关而有所不同。我的代码有一个伪随机数生成器,我认为根据这些开关,它们会被不同地调用。我希望能够使用每组开关来运行测试,并查看每个随机数生成器的调用方式是否有所不同。
120 c++  c  linux  callstack 

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.