10、会改变自己名字的进程

  问:你能写出一个在运行时改变自己进程名的程序吗?

  答:参见下面这段代码:

#include<stdio.h> 
 
int main(int argc, char *argv[]) 

    int i = 0; 
    char buff[100]; 
 
    memset(buff,0,sizeof(buff)); 
 
    strncpy(buff, argv[0], sizeof(buff)); 
    memset(argv[0],0,strlen(buff)); 
 
    strncpy(argv[0], "NewName", 7); 
 
    // Simulate a wait. Check the process 
    // name at this point. 
    for(;i<0xffffffff;i++); 
 
    return 0; 
}
 


  11、返回本地变量的地址

  问:下面代码有问题吗?如果有,该怎么修改?

#include<stdio.h> 
 
int* inc(int val) 

  int a = val; 
  a++; 
  return &a; 

 
int main(void) 

    int a = 10; 
    int *val = inc(a); 
    printf(" Incremented value is equal to [%d] ", *val); 
 
    return 0; 
}
 


  答:尽管上面的程序有时候能够正常运行,但是在“inc()”中存在严重的漏洞。这个函数返回本地变量的地址。因为本地变量的生命周期是“inc()”的生命周期,所以在inc结束后,使用本地变量会发生不好的结果。这可以通过将main()中变量“a”的地址来避免,这样以后还可以修改这个地址存储的值。

  12、处理printf()的参数

  问:下面代码会输出什么?

#include<stdio.h> 
 
int main(void) 

    int a = 10, b = 20, c = 30; 
    printf(" %d..%d..%d ", a+b+c, (b = b*2), (c = c*2)); 
 
    return 0; 
}
 


  答:输出结果是:

110..40..60


  这是因为C语言里函数的参数默认是从右往左处理的,输出时是从左往右。