1. 程式人生 > 其它 >記牛客網的一道很棒的C題目

記牛客網的一道很棒的C題目

記一下在牛客網上遇到的覺得很好很經典的題 題目連結

0x00 題目

以下函式用法正確的個數是:

void test1()
{
    unsigned char array[MAX_CHAR+1],i;
    for(i=0;i<=MAX_CHAR;i++){
        array[i]=i;
    }
}
char*test2()
{
    char p[] = "hello world";
    return p;
}
char *p =test2();
void test3(){
    char str[10];
    str++;
    *str='0';
}

0x01 解析

第一個問題:

重點不在於CHAR_MAX的取值是多少,而是在於i的取值範圍是多少。

一般char的取值範圍是-128到127,而u char 則是0255,所以i的取值範圍是0255.

所以當CHAR_MAX常量大於255時,執行i++後,i不能表示256以上的數字,所以導致無限迴圈。

第二個問題:

重點在於函式中p的身份,他是一個指標,還是陣列名;

如果是指標p,則p指向存放字串常量的地址,返回p則是返回字串常量地址值,呼叫函式結束字串常量不會消失(是常量)。所以返回常量的地址不會出錯。

如果是陣列p,則函式會將字串常量的字元逐個複製到p數組裡面,返回p則是返回陣列p,但是呼叫函式結束後p被銷燬,裡面的元素不存在了。

例子中p是陣列名,所以會出錯,p所指的地址是隨機值。

若是把char p[]="hello";改成char *p="hello";就可以了。

第三個問題:

重點在於str++;這實際的語句就是str=str+1;而str是陣列名,陣列名是常量,所以不能給常量賦值。(可以執行str+1,但是不能str=.)