Questions tagged «c»

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

5
斯坦福大学教程与GCC之间的冲突
根据这部电影(大约38分钟),如果我有两个具有相同局部变量的函数,则它们将使用相同的空间。因此,以下程序应打印5。编译gcc结果-1218960859。为什么? 该程序: #include <stdio.h> void A() { int a; printf("%i",a); } void B() { int a; a = 5; } int main() { B(); A(); return 0; } 根据要求,这是反汇编程序的输出: 0804840c <A>: 804840c: 55 push ebp 804840d: 89 e5 mov ebp,esp 804840f: 83 ec 28 sub esp,0x28 8048412: 8b 45 f4 …

3
如何处理静态链接库之间的符号冲突?
编写库时,最重要的规则和最佳实践之一是将库的所有符号放入特定于库的名称空间中。由于使用了namespace关键字,C ++使此操作变得容易。在C语言中,通常的方法是为标识符添加一些库特定的前缀。 C标准的规则放在那些一些限制(安全编译):AC编译器可以看只是一个标识符的前8个字符,所以foobar2k_eggs并foobar2k_spam可能被解释为有效相同标识符-但是每一个现代的编译器允许任意长标识符,因此在我们这个时代(21世纪),我们不必为此烦恼。 但是,如果您面对一些无法更改符号名称/标识符的库,该怎么办?也许您只有一个静态二进制文件和标头,或者不想,或者不允许自己进行调整和重新编译。

2
注释掉未使用的行后,开关盒将无法编译
这是我的代码: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> int main (void) { struct addrinfo hints; memset (&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_CANONNAME; struct addrinfo *res; getaddrinfo ("example.com", "http", &hints, &res); printf ("Host: %s\n", "example.com"); void *ptr; …
82 c 

2
为什么陈述“ 2i;” 不会导致编译器错误?
相反2*i,我粗心地写道2i: int foo(int i) { 2i; return 2i; } 我希望编译器能够捕获该错误。但事实并非如此。那么2i在C中有效的语句是吗?如果是这样,它怎么办?困惑! 我使用gcc版本5.3.0进行了编译,这是程序集的输出: .file "strange.c" .text .globl foo .type foo, @function foo: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl %edi, -4(%rbp) nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size foo, .-foo .ident …
82 c  syntax 



6
C中的共享全局变量
如何创建在C中共享的全局变量?如果我将其放在头文件中,则链接器会抱怨变量已定义。是在我的一个C文件中声明变量并手动在extern所有要使用它的其他C文件的顶部放入s的唯一方法吗?听起来不理想。

12
用C或C ++返回结构是否安全?
我的理解是不应该这样做,但是我相信我已经看过了类似示例的示例(注意,代码在语法上不一定正确,但思想确实存在) typedef struct{ int a,b; }mystruct; 然后是一个功能 mystruct func(int c, int d){ mystruct retval; retval.a = c; retval.b = d; return retval; } 我了解,如果我们想执行以下操作,则应始终返回指向malloc结构的指针,但我很肯定看到了执行此操作的示例。它是否正确?就我个人而言,我总是返回指向malloc的结构的指针,或者只是通过对该函数的引用进行传递并在那里修改值。(因为我的理解是,一旦函数的作用域结束,用于分配结构的任何堆栈都将被覆盖)。 让我们在问题中添加第二部分:这是否因编译器而异?如果可以,那么最新版本的台式机编译器(gcc,g ++和Visual Studio)的行为是什么? 有什么想法吗?

16
C中struct成员的默认值
是否可以为某些结构成员设置默认值?我尝试了以下操作,但会导致语法错误: typedef struct { int flag = 3; } MyStruct; 错误: $ gcc -o testIt test.c test.c:7: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token test.c: In function ‘main’: test.c:17: error: ‘struct <anonymous>’ has no member named ‘flag’
82 c  struct 



7
(为什么)使用未初始化变量的未定义行为?
如果我有: unsigned int x; x -= x; 很显然,在此表达式之后x 应该为零,但是我所看到的所有地方都说该代码的行为是不确定的,而不仅仅是x(直到减法之前)的值。 两个问题: 此代码的行为确实未定义吗? (例如,代码是否可能在兼容的系统上崩溃?) 如果是这样,为什么C明确表示该行为x为零,为什么还说行为未定义? 即,通过在此不定义行为有什么好处? 显然,编译器可以在变量内部简单地使用它认为“方便”的任何垃圾值,并且可以按预期工作……该方法有什么问题?

5
snprintf()总是终止为null吗?
snprintf是否始终为null终止目标缓冲区? 换句话说,这是否足够: char dst[10]; snprintf(dst, sizeof (dst), "blah %s", somestr); 还是如果somestr足够长,您必须这样做吗? char dst[10]; somestr[sizeof (dst) - 1] = '\0'; snprintf(dst, sizeof (dst) - 1, "blah %s", somestr); 我对标准所说的内容以及某些流行的libc可能做什么(这不是标准行为)都感兴趣。
82 c  posix  libc 

10
C无阻塞键盘输入
我正在尝试使用C语言编写一个程序(在Linux上),直到用户按下某个键为止,该程序才会循环运行,但不要求按键即可继续每个循环。 有没有简单的方法可以做到这一点?我认为我可以做到,select()但这似乎需要大量工作。 另外,有没有办法在程序关闭之前捕获ctrl-c按键进行清理,而不是非阻塞io?


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.