来自面试的C问题

The*_*GiG 0 c

在这些代码失败的哪些行中(意思是:不做它们应该做的事情),为什么?

int main(void) {
 char student[64] = "some guy";
 char* teacher;

 /* line1 */ strcpy(teacher, student);
 /* line2 */ teacher=student;
 /* line3 */ strcpy(student, "Alber Einstein");
 /* line4 */ student = teacher;
}
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 8

第1行导致未定义的行为.第4行甚至不会编译.由于这似乎很容易成为一个家庭作业问题,而且我不想完全放弃,快速阅读comp.lang.c常见问题解答C语言规范将解释原因.


Ste*_*non 8

开玩笑,但也很严肃:

  • 第1行失败是因为您使用了该strcpy( )函数,如果维护程序员student在将来的某个时间点增加了数组的大小,则可能导致副本覆盖目标缓冲区的边界.这可能允许在某些环境中执行任意代码,并且是一个安全漏洞.

  • 第2行失败,因为您现在有相同内存块的两个名称,如果稍后使用它们,可能会导致别名冲突和数据损坏.

  • 第3行失败是因为您拼错了Albert Einstein的名字.

  • 第4行失败,因为它无效C.

关键是,您需要先制定一个规范,然后才能对程序如何执行或不执行失败进行有意义的讨论.