關於指針的一個面試題

  前幾天,去一個公司面試實習生,遇到下面這個題:
  

void 
test(void)
{
    char *str = NULL;

    get_memory(str);
    strcpy(str, "hello world");

    printf("%s\n", str);
}

void
get_memory(char *p)
{
    p = (char *)malloc(sizeof(char) * 100);
}


  問此段代碼的運行結果?如果有錯誤怎麼改,爲什麼?
 
  拿到這道題的時候,感覺都對着呢,剛開始以爲是malloc()申請完空間,函數結束釋放了,可後來想到如果malloc()申請的空間沒有free(),則此空間仍然存在,所以不是這個問題。那我就想會不會是內存泄漏呢?因爲申請的空間沒有free(),而且strcpy也是一個不安全的函數,也有可能造成內存泄漏,可是考點真的是這個麼,我猶豫了,因爲就算不釋放,也不會影響到程序的運行結果。
 
  回來後,我調試這個程序,運行結果是段錯誤。按照自己的想法對代碼進行了修改,依然是段錯誤。調試的時候,發現get_memory()中p的值的確是一個地址,而打印test()中的str的地址卻是0。看來p並沒有真正的返回到str中。
  其實,我們要修改的是指針,下面是正確的代碼段(加粗斜體部分是修改的部分):

void
test(void)
{
    char *str = NULL;
        
    get_memory(&str);
    strcpy(str, "hello world");
        
    printf("%s\n", str);
}

void
get_memory(char **p)
{
   *p = (char *)malloc(sizeof(char) * 100);
}


是不是豁然開朗呢?沒錯,考得就是二級指針,和傳參的問題。我們需要修改的是str的地址,而不是str所指向空間。
 
  覺得自己很菜啊,一定要認真,仔細的看題,平時一定要多多實踐。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章