Questions tagged «c»

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


4
1.#INF00,-1。#IND00和-1。#IND是什么意思?
我在弄乱一些使用浮点数的C代码,当我尝试在屏幕上打印浮点数时,得到1.#INF00,-1。#IND00和-1。#IND。这些值是什么意思? 我相信1.#INF00表示正无穷大,但是-1。#IND00和-1。#IND呢?有时我还会看到以下值:1. $ NaN不是数字,但是是什么原因导致这些奇怪的值,这些值如何帮助我进行调试? 我使用的是MinGW,我相信它将IEEE 754表示形式用于浮点数。 有人可以列出所有这些无效值及其含义吗?
67 c++  c 

7
atol()v / s。strtol()
atol()和strtol()有什么区别? 根据他们的手册页,它们似乎具有相同的效果以及匹配的参数: long atol(const char *nptr); long int strtol(const char *nptr, char **endptr, int base); 在一般情况下,当我不想使用base参数(我只有十进制数字)时,应该使用哪个函数?
67 c  strtol 

8
从C重新路由stdin和stdout
我想重新打开stdinand stdout(也许stderr在我在的时候)文件句柄,以便将来对printf()orputchar()或or的调用puts()将转到文件,而将来对getc()诸如此类的调用将来自文件。 1)我不想永久失去标准的输入/输出/错误。我可能想稍后在程序中重用它们。 2)我不想打开新的文件句柄,因为这些文件句柄将必须大量传递或全局传递(颤抖)。 3)如果我不能帮忙,我不想使用任何open()或fork()其他依赖于系统的功能。 因此,基本上,这样做是否有效: stdin = fopen("newin", "r"); 而且,如果可以,我如何获得stdinback的原始值?我是否必须将其存储在中FILE *并稍后再取回?
67 c  redirect  stdio 

10
升级到Catalina 10.15后,无法在Mac上编译C程序
升级到Mojave后,还有一个问题无法在Mac上编译C程序,而该问题的答案已涵盖了发生问题的大多数变化。 现在-从2019年10月7日星期一开始-您可以升级到macOS Catalina 10.15。再次,在升级过程中/usr/include,即使在从Mojave 10.14.6升级到Catalina之前安装了XCode 11.0 ,该目录也已被更新所破坏。因此,编译器预期没有/usr/include目录,因此不再起作用。 建议的解决Mojave问题的主要步骤-使用以下命令: open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg 由于目录/Library/Developer/CommandLineTools/Packages/不存在(因此尚无.pkg要打开的文件),因此无法正常工作。 有没有一种好的(官方)方法来创建和填充目录/usr/include?
64 c  xcode  macos  gcc  macos-catalina 

4
在结构数组的末尾需要空括号'{}'是什么?
我在Linux内核中命中了一些C 代码: static struct ctl_table ip_ct_sysctl_table[] = { { .procname = "ip_conntrack_max", .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec, }, // ... { .procname = "ip_conntrack_log_invalid", .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = &log_invalid_proto_min, .extra2 = &log_invalid_proto_max, }, { } }; 这里的结构数组以结尾{ }。它是出于什么目的添加的? …


4
如果缺少const char *数组初始化逗号,则生成编译器警告
我在C代码中经常使用字符串文字表。这些表或多或少看起来像这样: static const char* const stateNames[STATE_AMOUNT] = { "Init state", "Run state", "Pause state", "Error state", }; 上面代码的问题是,如果表变长了,并且在开发过程中被修改了,我会不时忘记逗号。代码编译时不会出现逗号缺失的问题,但是由于最后一个字符串设置为,我的程序最终崩溃了NULL。我使用了MinGW和Keil编译器进行了验证。 如果缺少逗号,有什么方法可以为我的初始化生成编译器警告吗?
53 c  initialization 

6
(x | y)-y为什么不能简单地是x甚至`x | 0`
我正在阅读内核代码,在一个地方,我看到了一个语句内部的表达式,if例如 if (value == (SPINLOCK_SHARED | 1) - 1) { ............ } 其中SPINLOCK_SHARED = 0x80000000是预定义常数。 我想知道为什么我们需要(SPINLOCK_SHARED | 1) - 1-用于类型转换?表达式的结果将是80000000-与0x80000000相同,不是吗?但是,“或1”和“减1”为何重要? 感觉好像我想不到的东西..


2
为什么argc和argv的地址相隔12个字节?
我在计算机(运行Linux的64位Intel)上运行了以下程序。 #include <stdio.h> void test(int argc, char **argv) { printf("[test] Argc Pointer: %p\n", &argc); printf("[test] Argv Pointer: %p\n", &argv); } int main(int argc, char **argv) { printf("Argc Pointer: %p\n", &argc); printf("Argv Pointer: %p\n", &argv); printf("Size of &argc: %lu\n", sizeof (&argc)); printf("Size of &argv: %lu\n", sizeof (&argv)); test(argc, argv); return 0; …


6
为什么要声明这种取消引用编译器特定的类型标记指针警告?
我已经阅读了 有关Stack Overflow RE的各种文章 :取消引用类型标记的指针错误。我的理解是,该错误本质上是编译器警告,它警告通过不同类型的指针访问对象的危险(尽管似乎为产生了例外),这是可以理解且合理的警告。 char* 我的问题特定于以下代码:为什么将指针的地址强制转换void**为对此警告有效的指针(通过提升为错误-Werror)? 而且,此代码针对多个目标体系结构进行了编译,只有其中一种会生成警告/错误-这是否暗示它合法地是特定于编译器版本的缺陷? // main.c #include <stdlib.h> typedef struct Foo { int i; } Foo; void freeFunc( void** obj ) { if ( obj && * obj ) { free( *obj ); *obj = NULL; } } int main( int argc, char* argv[] ) { …
38 c  pointers  casting 

3
无法将'#'字符作为命令行参数传递
我不能传递#以命令行参数开头的字符串。 这是一个简单的测试: #include <stdio.h> int main(int argc, char *argv[]) { for (int i = 1; i < argc; i++) printf("%s ", argv[i]); putchar('\n'); return 0; } 如果我输入参数如下: 2 4 # 5 6 argcis 3和not 的值6。它会#在此处读取并停止。我不知道为什么,在C语言和C Primer Plus的副本中也找不到答案。

7
为什么我不能访问堆栈数组的指针?
请看下面的代码。它尝试将数组作为a char**传递给函数: #include <stdio.h> #include <stdlib.h> static void printchar(char **x) { printf("Test: %c\n", (*x)[0]); } int main(int argc, char *argv[]) { char test[256]; char *test2 = malloc(256); test[0] = 'B'; test2[0] = 'A'; printchar(&test2); // works printchar((char **) &test); // crashes because *x in printchar() has an invalid pointer free(test2); …
35 c 

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.