C语言错题集

77 阅读2分钟

一:

题目:

来源:中国大学MOOC“程序设计入门——C语言”第十六开课期末考试第27题

以下代码段的输出是: ‌

char a[20]="cehiknqtw"; 

char *s="fbla", *p; 

int i, j; 

for(p=s; *p; p++) 

{    
    j=0;    
  
    while (*p>=a[j] && a[j]!='\0') 
        j++;    
        
    for(i=strlen(a); i>=j; i--) 
        a[i+1] = a[i];    
        
    a[j]=*p; 
} 

printf("%s", a);

解答:

abcefhiklnqtw

代码本质:将字符串s中的每个字符,从右往左,依次插入字符数组a中,插入规则按照字母表顺序

二:

题目:

来源:中国大学MOOC“C语言程序设计进阶”第十五次开课小测验1.2第一题 对于以下代码段,正确的说法是:

char *p; 
while (1) {    
    p = malloc(1);    
    *p = 0;   
}
  • A. 最终程序会因为没有没有空间了而退出

  • B. 最终程序会因为向0地址写入而退出

  • C. 程序会一直运行下去

  • D. 程序不能被编译

解答:

  • D. 这段代码是合法的,所以可以编译。
  • C. 肯定是无法永远运行下去啦。
  • A. 这确实是引起程序终止的原因,但不是直接原因。
  • B. 程序一直分配内存,肯定会引起内存耗尽。而malloc在分配内存失败时并不会终止程序,而是返回NULL指针。而第5行代码试图向NULL指针位置写入数据,这会引起程序终止(通常操作系统会因为“段错误”而终止程序)。

所以 B 才是引起程序退出的直接原因。

www.imooc.com/wenda/detai…

三:

题目:

以下代码段的输出是:

int x, y, z, w; 
void p(int *y, int x) {     
    static int w;     
    *y++; 
    x++; 
    w = x+*--y;     
    printf("%d#%d#%d#%d#",x,*y,z,w); 
} 

int main(void) 
{     
    int x, y, z, w;     
    x=y=z=w=1;     
    do
    {         
        static int x;         
        p(&x, y);         
        printf("%d#%d#%d#%d#",x,y,z,w);     
    } while(0);   
    
    return 0;
}

正确答案:2#0#0#2#0#1#1#1#

解析:

  1. 静态变量和全局变量初始化为0
  2. 变量优先级:全局变量<本地变量<代码块变量
  3. *y++:取y指向的值,然后y指针后移。不改变y指向的值
  4. *--y:y指针前移,然后取值