5、free()函数

  问:下面的程序会在用户输入'freeze'的时候出问题,而'zebra'则不会,为什么?

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

    char *ptr = (char*)malloc(10); 
 
    if(NULL == ptr) 
    { 
        printf(" Malloc failed "); 
        return -1; 
    } 
    else if(argc == 1) 
    { 
        printf(" Usage  "); 
    } 
    else 
    { 
        memset(ptr, 0, 10); 
 
        strncpy(ptr, argv[1], 9); 
 
        while(*ptr != 'z') 
        { 
            if(*ptr == '') 
                break; 
            else 
                ptr++; 
        } 
 
        if(*ptr == 'z') 
        { 
            printf(" String contains 'z' "); 
            // Do some more processing 
        } 
 
       free(ptr); 
    } 
 
    return 0; 
}
 


  答:这里的问题在于,代码会(通过增加“ptr”)修改while循环里“ptr”存储的地址。当输入“zebra”时,while循环会在执行前被终止,因此传给free()的变量是传给malloc()的地址。但在“freeze”时,“ptr”存储的地址会在while循环里被修改,因此导致传给free()的地址出错,也导致了seg-fault或者崩溃。

  6、使用_exit退出

  问:在下面的代码中,atexit()并没有被调用,为什么?

#include<stdio.h> 
 
void func(void) 

    printf(" Cleanup function called "); 
    return; 

 
int main(void) 

    int i = 0; 
 
    atexit(func); 
 
    for(;i<0xffffff;i++); 
 
    _exit(0); 
}
 


  这是因为_exit()函数的使用,该函数并没有调用atexit()等函数清理。如果使用atexit()应当使用exit()或者“return”与之相配合。