您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“C語言中函數返回值不一致問題如何解決”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C語言中函數返回值不一致問題如何解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
在運行成程序上有時會發現函數內部的值與返回到主函數的值會相差很多出現隨機值,但是它們的地址卻相同!**一般的原因多是內存污染,多發于函數返回數組地址**或返回主函數后直接應用。
例如下面的兩個程序,不用關心它做了什么,只需觀察它們的不同點(已注釋)
#include <stdio.h> #include <ctype.h> int *count_e(char *str); int main(){ char str[] = {"abc,cba,def"}; int *a,i; a = count_e(str); puts("\n"); for(i=0;i<5;i++){ printf(" a[%d] = %d ; &a = %p;\n",i,a[i],&a[i]); } free(a); return 0; } int *count_e(char *str){ if(str == NULL) return NULL; int ls[5] = {0}; //關鍵!!!內存污染問題! int i,k,t; i = k = t = 0; while(isspace(str[i])) i++; while(str[i]){ if(isupper(str[i])){ ls[1]++;k=1; }else if(islower(str[i])){ ls[2]++;k=1; }else if(isdigit(str[i])){ ls[4]++;k=1; }else if(isspace(str[i])){ t = 1; }else{ ls[3]++;t=1; } if(k==1 && t ==1){ ls[0]++; k = t = 0; } i++; } for(t=0;t<5;t++) printf("ls[%d] = %d ; &ls[i] = %p\n",t,ls[t],&ls[t]); if(! isspace(str[--i])) ls[0]++; return ls; }
運行如下:
ls[0] = 2 ; &ls[i] = 000000000062FDB0
ls[1] = 0 ; &ls[i] = 000000000062FDB4
ls[2] = 9 ; &ls[i] = 000000000062FDB8
ls[3] = 2 ; &ls[i] = 000000000062FDBC
ls[4] = 0 ; &ls[i] = 000000000062FDC0 // !!!a[0] = 239139376 ; &a = 000000000062FDB0;
a[1] = 32760 ; &a = 000000000062FDB4;
a[2] = 1 ; &a = 000000000062FDB8;
a[3] = 0 ; &a = 000000000062FDBC;
a[4] = 11146080 ; &a = 000000000062FDC0; // !!!注意
------------------------------------分割線-----------------------------------------
#include <stdio.h> #include <ctype.h> int *count_e(char *str); int main(){ char str[] = {"abc,cba,def"}; int *a,i; a = count_e(str); for(i=0;i<5;i++){ printf(" a[%d] = %d ; &a = %p;\n",i,a[i],&a[i]); } free(a); return 0; } int *count_e(char *str){ if(str == NULL) return NULL; int *ls = (int *)calloc(5,sizeof(int)); //ls[5] = {0}; !!!注意不同!!!內存污染問題!** int i,k,t; i = k = t = 0; while(isspace(str[i])) i++; while(str[i]){ if(isupper(str[i])){ ls[1]++;k=1; }else if(islower(str[i])){ ls[2]++;k=1; }else if(isdigit(str[i])){ ls[4]++;k=1; }else if(isspace(str[i])){ t = 1; }else{ ls[3]++;t=1; } if(k==1 && t ==1){ ls[0]++; k = t = 0; } i++; } for(t=0;t<5;t++) printf("ls[%d] = %d ; &ls[i] = %p\n",t,ls[t],&ls[t]); if(! isspace(str[--i])) ls[0]++; return ls; }
運行如下:
ls[0] = 2 ; &ls[i] = 00000000001D1430
ls[1] = 0 ; &ls[i] = 00000000001D1434
ls[2] = 9 ; &ls[i] = 00000000001D1438
ls[3] = 2 ; &ls[i] = 00000000001D143C
ls[4] = 0 ; &ls[i] = 00000000001D1440 //!!!!a[0] = 3 ; &a = 00000000001D1430;
a[1] = 0 ; &a = 00000000001D1434;
a[2] = 9 ; &a = 00000000001D1438;
a[3] = 2 ; &a = 00000000001D143C;
a[4] = 0 ; &a = 00000000001D1440; // !!!!
此示例運用了分配內存的方法cmalloc()函數來替代直接創建的數組。
一般情況下,通過函數的調用,使調用函數可以獲得被調用函數的函數值,這個值就叫做返回值。
①、有的函數有返回值,有的函數沒有返回值,具體看函數的聲明類型,如果返回值類型為 void 則為無返回值類型;
②、函數的返回值是通過函數中的 return 語句獲得的。一個函數中可以有一個以上的return語句,執行到哪個return就從哪個return返回了,return語句執行完之后,他之后的代碼不會被執行;
③、函數內部的return返回值類型要與函數本身定義時候的返回值類型一致,即使不一致也是可以相互轉化的,最終以函數定義時候的返回值類型為主進行轉化,若轉化不了則編譯期間就報錯了;
④、原則上一個函數只能有一個返回值,若要返回多個值則可以通過參數返回或者返回結構類型等等。
讀到這里,這篇“C語言中函數返回值不一致問題如何解決”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。