C語言中函數返回字符串的4中方法

C語言中函數返回字符串的4中方法

  • 函數的構成部分:返回類型、函數名稱、參數、函數主體
  • 參數:函數調用時傳入的參數稱爲實參,函數定義時出現的參數爲形參
    • 形參的做用在於接收實參傳入的值,形參和函數內部的其餘局部變量相同,在進入函數建立,退出函數銷燬
    • 值傳遞:實參的實際值複製給形式參數。修改形參不會改變實際參數
    • 引用傳遞:指針傳遞,將實參地址複製給形參,修改形參指向的值時,實參也會發生改變
    • 由此,能夠得知不管是形式結合仍是return語句返回時,都存在一個拷貝的過程。值傳遞的過程是將這個值拷貝一份在函數內部使用,引用傳遞的過程是將地址拷貝一份使用。一樣在return返回時,返回一個值,函數會將該值拷貝一份供主函數使用,返回指針,天然拷貝的就是一個地址,供主函數使用。
  • 下面是一個錯誤示例
  • #include <stdio.h>
      #include <string.h>
    
      char * retstring();
      int main()
      {
          char * name2;
          name2 = retstring();
          printf("%s\n",name2);
          return 0;
      }
    
      char * retstring()
      {
          char name[10]; 
          strcpy(name,"漢青");
          return name;
      }
  • 上面這段代碼會出現一個警告,這是由於返回了一個局部變量name的地址。在主函數中該局部變量name時處於銷燬狀態,因此name內存空間尚未被重寫的話主函數中name2的值是正確,若是被其餘程序重寫,就會出現未知異常。
  • 因此返回局部變量的字符串時很可怕的
  • 函數返回字符串的方法:
    1. 將字符串指針做爲函數參數傳入,並返回該指針
    2. 使用malloc函數動態分配內存,在主調函數中釋放
    3. 返回一個靜態局部變量
    4. 使用全局變量

將字符串指針做爲函數參數傳入,並返回

  • 典型的strcpy函數應該採用的就是這種方法:
    • char* strcpy(char* des,const char* source)
        {
            char* r=des;
            assert((des != NULL) && (source != NULL));
            while((*r++ = *source++)!='\0');
            return des;
        }

使用malloc函數動態分配內存,可是必定要注意在主調函數中將其釋放,由於malloc動態分配的內存位於堆區,而堆區的內存是須要本身釋放的

  • #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
    
      char * retstring();
      int main()
      {
          char * name2;
          name2 = retstring();
          printf("%s\n",name2);
          //記住必定要用free釋放,不然會形成內存泄露
          free(name2);
          return 0;
      }
    
      char * retstring()
      {
          char * name;
          name = (char *)malloc(10); 
          strcpy(name,"張漢青");
          return name;
      }

返回一個靜態局部變量

  • #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
    
      char * retstring();
      int main()
      {
          char * name2;
          name2 = retstring();
          printf("%s\n",name2);
          return 0;
      }
    
      char * retstring()
      {
          static char name[10];
          strcpy(name,"張漢青");
          return name;
      }
  • 這種方法在於採用了靜態局部變量(位於靜態區,程序結束時由系統釋放),這會致使,下一次調用會將上次調用產生的結構進行覆蓋。
  • 使用這樣的函數應該當即將結構拷貝一份

使用全局變量

  • char   g_s[100]; 
      char*   fun() 
      { 
              strcpy(g_s,   "abc "); 
              return   g_s; 
      }

函數返回字符串問題

  • 歸根結底,返回字符串就是要返回一個地址,同時須要保證地址在主調函數有效。
  • 直接定義char*變量,會保存在棧區,變量的做用域外會被當即銷燬;malloc申請空間保存在堆區,須要手動銷燬;靜態區變量程序結束時銷燬。
  • 因此返回一個地址要麼擴大他的做用域,要麼控制其生命週期。
  • 引用自:http://www.javashuo.com/article/p-ksggwuhq-be.html
相關文章
相關標籤/搜索