【面試易錯題】陷阱題集一

1.【OJ】設計一個函數sum(n)=1+2+...+n,假設sum(n)不超過整型數表示範圍。函數

錯誤解法:設計

int sum(n){
    int ans;
    ans = n*(n+1)/2;
    return ans;
}
錯誤在於:n*(n+1)時可能已經超出了整型數的表示範圍,形成溢出錯誤。

int sum(n){
    if(n%2)
        return (n+1)/2*n;
    else
        return n/2*(n+1);
}

2.【美圖】請寫出下面程序的運行結果。指針

void func(void){
    char *dst;
    dst = (char*)malloc(sizeof(char)*1024);
    strcpy(dst, "Hello");
    free(dst);
    if(dst!=NULL){
        strcpy(dst, "World");
    }
    printf("%s", dst);
}
易錯之處:

①free後只是將堆空間交還給系統,並不對指針變量dst和dst所指向的內存空間內容進行修改;code

②free後的dst指針是野指針,若是系統在free後佔用dst所指空間,那麼對dst的操做將產生錯誤,若是系統並沒佔用dst所指空間,操做是成功的,可是隱患很大。blog

因此上面代碼運行結果可能爲:程序出錯,非法訪問內存;輸出World字樣。ip

3.【美圖】請指出下面程序的錯誤。內存

char* func(char *s, int len){
    char dst[1024];
    memcpy(dst, s, len);
    return dst;
}
易錯之處:

①memcpy與strcpy不一樣,memcpy嚴格按照指定參數len來複制字節數,因此這裏可能會遺漏'\0'字符串結束符,致使錯誤;字符串

②dst爲局部變量,當函數返回時,dst所指向的1024個字節空間將被釋放(退棧),所返回的dst指針指向的內容會被其餘內容所覆蓋,因此返回的dst是無用的。


class

相關文章
相關標籤/搜索