C程序员应该知道什么?[关闭]


12

每个体面的C程序员都应该了解/知道的一些概念/技术/语言功能(不包括通用软件工程和类似软件,仅专注于C特定的东西)。我想知道,以便我能够填补我的C知识中的某些空白。


9
从Stack Overflow的C问题开始,看看是否有您不知道的东西。
chrisaycock

3
AC程序员可能应该知道2 + 2 = 4
Edward Strange

21
他们应该知道一家出售防弹鞋的商店。
亚当·克罗斯兰

1
关于这一主题有数百本书。您的问题确实很模糊。您将不得不更加具体,以获得像样的答案,而不仅仅是一个清单。看到到目前为止,这个问题的答案已经泛滥成灾,我认为它需要重新设计或结束。
Walter

2
另一种编程语言?
穆罕默德·阿尔卡鲁里

Answers:


19

特定于C?除了大多数过程语言通用的标准构造之外,我还必须说:

  • (ab)使用预处理器
  • 链接器与编译器
  • 指针指针指针!
  • 数组如何指针是数组
  • C字符串如何工作,以及它们如何也是指针和数组
  • C字符串使用不当会如何导致缓冲区溢出
  • 如何将任何东西投射到任何东西(毕竟都是1和0 :))
  • 手动内存管理malloc / free
  • 堆叠与堆
  • 指针别名,(为什么它在C99中是非法的)
  • 根据具有一组公开显示的功能而不是严格的类的模块(.h / .c文件)来考虑开发
  • 工会
  • 为何sprintf会让您感到震惊
  • 功能指针

我将“缓冲区溢出”添加到列表中。
艾丹·库利(Aidan Cully)

@Aidan,好抓。添加。
Doug T.

2
C数组和指针如何不同:books.google.ca/…–
Matthieu

指针应该至少重复3次以上
Gaurav

8

了解指针,您将了解计算机。


12
不,您只会对您了解计算机有一种幻想。
Job

5

除了毕达格拉斯的出色答案之外,

如何编写(或至少阅读)复杂的声明,例如 char (*(*funcs[4])())[10]

funcs是指向函数的指针的数组[4],该函数返回指向char的数组[10]的指针


1
如果它变得如此复杂,也许这属于注释?
工作

7
也许他应该学习如何避免那样写?
FabianB

3
  1. 整数提升规则
  2. 将一切初始化为已知值
  3. GOTO并不是邪恶的,特别是当用于处理异常/失败时
  4. malloc和/或calloc可以返回NULL ...确保您的检查返回值
  5. 频繁的小内存分配可能导致堆碎片。
  6. 指针算术
  7. 位面具是你的朋友
  8. x >> 1等于无符号整数的x / 2

+1表示GOTO不作恶:)
zvrba 2011年

2

AC程序员应该知道...其他语言!;-)从其他各种范式的语言(例如OOP,函数式编程等)中了解概念始终是富有成果的。

更严重的是,看一眼混乱的编程竞赛很有趣,而且很好奇的是,这也是一次很好的体验。


2

我在对毕达格拉斯的回答的评论中提到“缓冲区溢出”,我可能应该澄清一下我的意思。在C语言中,这是不够的,知道直接与内存的工作是危险的-你也应该明白的精确方法,使这是危险的。在所有这些情况下,我都不太喜欢用“朝自己开枪”的比喻-很多时候,不是拉动触发器,而是常常是与您和/或用户的利益背道而驰的演员。

例如,在具有递减堆栈的体系结构中(最流行的体系结构符合此要求-通常包括x86和ARM),当您调用函数时,该函数的返回地址将被放置在栈中定义的局部变量之后。函数的主体。因此,如果您将缓冲区声明为局部变量,并在不检查缓冲区溢出的情况下将该变量暴露给外部世界,例如:

void myFn(void) {
    char buf[256];
    gets(buf);
}

外部用户可以向您发送一个字符串,该字符串将覆盖堆栈中的返回地址-基本上,他可以更改程序的调用图(导致当前函数)的运行时概念。因此,用户为您提供了一个字符串,该字符串是针对您的体系结构的一些可执行代码的二进制表示形式,具有足够的填充量,从而使溢出了堆栈myFn,还有一些其他数据可以覆盖返回地址myFn以指向他给您的代码。如果发生这种情况,则myFn通常在将控制权交还给其调用者时,它将分支到恶意用户提供的代码。如果编写的C(或C ++)代码有可能暴露给不受信任的用户,则需要了解此攻击媒介。您应该了解为什么堆栈中的缓冲区溢出比堆栈中的缓冲区溢出经常(但并非总是)更容易被利用,并且您应该了解堆栈中的内存的布局方式(不一定要太详细,但是malloc()ed区域周围具有控制结构的想法可以帮助理解为什么您的程序在另一个malloc()(或free())中崩溃。

C为您提供了有关计算机工作方式的低级详细信息,它使您可以比当今广泛使用的任何其他用户编辑语言更直接地控制计算机。强大的能力伴随着巨大的责任-您实际上需要了解那些低级细节,才能安全有效地使用C。


0

除了其他好的答案,我还要 在列表中添加防御性编程技术。

例如,在功能开始/结束时使用断言来验证合同。

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.