Questions tagged «c»

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

12
为什么C中的`free`不占用要释放的字节数?
明确一点:我确实知道malloc并free在C库中实现,该库通常从OS分配内存块,并进行自己的管理以将较小的内存分配给应用程序,并跟踪分配的字节数。这个问题不是免费如何知道多少免费。 相反,我想知道为什么free首先要采用这种方式。作为一种低级语言,我认为要求C程序员不仅跟踪分配了什么内存而且跟踪多少内存是完全合理的(实际上,我通常发现我最终跟踪了字节数)仍然分配)。在我看来,明确给出字节数free可能会允许某些性能优化,例如,具有针对不同分配大小的单独池的分配器将能够通过查看输入参数来确定要释放哪个池,并且总体而言,空间开销会更少。 因此,简而言之,为什么要创建malloc和free创建它们以使它们在内部跟踪分配的字节数?这只是历史性的意外吗? 一个小的修改:一些人提供了一些要点,例如“如果您释放的金额与分配的金额不同,将会怎样?” 我想象中的API可能只需要一个就可以准确释放分配的字节数。释放或多或少可以简单地由UB或实现定义。不过,我不想阻止关于其他可能性的讨论。

7
如何从C调用C ++函数?
我知道这个。 从C ++调用C函数: 如果我的应用程序是C ++,并且必须从用C编写的库中调用函数,那么我会使用 //main.cpp extern "C" void C_library_function(int x, int y);//prototype C_library_function(2,4);// directly using it. 这不会破坏名称C_library_function,链接器将在其输入* .lib文件中找到相同的名称,从而解决了问题。 从C调用C ++函数??? 但是在这里,我扩展了一个用C编写的大型应用程序,我需要使用一个用C ++编写的库。C ++的名称修改在这里引起麻烦。链接器抱怨未解析的符号。好吧,我不能在我的C项目上使用C ++编译器,因为那打破了很多其他东西。出路是什么? 顺便说一句,我正在使用MSVC
84 c++  c  visual-c++  extern-c 

10
超高性能C / C ++哈希图(表,字典)
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。 5年前关闭。 改善这个问题 我需要将原始键(int,也许很长)映射为高性能哈希映射数据结构中的结构值。 我的程序将包含几百个这样的映射,每个映射通常最多具有数千个条目。但是,这些地图会不断“刷新”或“搅动”;想象处理数以百万计add和delete消息的第二。 C或C ++中的哪些库具有适合此用例的数据结构?或者,您如何建议自己建造?谢谢!

15
如何使用`switch`语句比较C中的字符串?
在C语言中,有一种switch结构可以使用户根据测试整数值执行不同的条件代码分支,例如, int a; /* Read the value of "a" from some source, e.g. user input */ switch (a) { case 100: // Code break; case 200: // Code break; default: // Code break; } 对于字符串值(即a),如何获得相同的行为(即避免所谓的“ if-else阶梯”)char *?

12
如何清除C中的输入缓冲区?
我有以下程序: int main(int argc, char *argv[]) { char ch1, ch2; printf("Input the first character:"); // Line 1 scanf("%c", &ch1); printf("Input the second character:"); // Line 2 ch2 = getchar(); printf("ch1=%c, ASCII code = %d\n", ch1, ch1); printf("ch2=%c, ASCII code = %d\n", ch2, ch2); system("PAUSE"); return 0; } 正如上面代码的作者所解释的:该程序将无法正常运行,因为在第1行,当用户按下Enter键时,它将保留在输入缓冲区2中的字符:Enter key (ASCII …
84 c  buffer 

2
确切地说,双字符串技巧是如何工作的?
至少某些C预处理程序使您可以将宏的值而不是其名称进行字符串化,方法是将其通过一个类似于函数的宏传递给另一个对其进行字符串化的宏: #define STR1(x) #x #define STR2(x) STR1(x) #define THE_ANSWER 42 #define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */ 这里的示例用例。 这确实有效,至少在GCC和Clang(都带有-std=c99)中有效,但是我不确定它在C标准术语下如何工作。 C99是否可以保证这种行为? 如果是这样,C99如何保证? 如果不是,那么行为在什么时候从C定义变为GCC定义?

8
为什么GDB会在行与行之间意外地跳转并将变量打印为“ <值优化输出>”?
谁能解释gdb的这种行为? 900 memset(&amp;new_ckpt_info,'\0',sizeof(CKPT_INFO)); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_** HDR),i_offset); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_ HDR),i_offset);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 …


9
C中字符串文字的“生存期”
下列函数返回的指针不会不可访问吗? char *foo(int rc) { switch (rc) { case 1: return("one"); case 2: return("two"); default: return("whatever"); } } 因此,C / C ++中局部变量的生存期实际上仅在函数内,对吗?这意味着char* foo(int)终止后返回的指针不再意味着什么,对吗? 我对局部变量的生存期感到困惑。什么是好的澄清?


5
了解INADDR_ANY进行套接字编程
我正在尝试编程一些套接字,因此在服务器端,我使用htonl(INADDR_ANY)。就我所知,在我看来,该功能会生成一个随机IP(我正确吗?)。实际上,我想将套接字与绑定localhost。但是如果我运行这个 printf("%d",htonl(INADDR_ANY)); 我得到0作为返回值。有人可以带来一些解释吗?
84 c  sockets 

11
在分配的内存上不使用free()是否可以吗?
我正在学习计算机工程,并且有一些电子课程。我听到了,从我的两个教授(这些课程),有可能避免使用的free()功能(后malloc(),calloc()等),因为分配可能不会被再次使用的存储空间分配等内存。也就是说,例如,如果您分配4个字节然后释放它们,则将有4个字节的空间,可能不会再分配:您将有一个Hole。 我认为这很疯狂:您不能拥有一个非玩具程序,在其中不释放内存就在堆上分配内存。但是我没有知识来确切解释为什么它如此重要以至于每个人都malloc()必须有一个free()。 因此:在任何情况下都可以malloc()不使用而使用afree()吗?如果没有,我该如何向教授解释?

11
饱和减/加无符号字节
假设我有两个无符号字节b和x。我需要计算bsubasb - x和baddas b + x。但是,我不希望在这些操作期间发生下溢/上溢。例如(伪代码): b = 3; x = 5; bsub = b - x; // bsub must be 0, not 254 和 b = 250; x = 10; badd = b + x; // badd must be 255, not 4 这样做的明显方法包括分支: bsub = b - min(b, x); …


15
C的推荐gcc警告选项[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 改善这个问题 除了-Wall以外,人们发现其他哪些警告有用? http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
83 c  gcc  compiler-errors 

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.