溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言中函數(shù)返回值不一致問題如何解決

發(fā)布時間:2023-02-24 11:14:15 來源:億速云 閱讀:143 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“C語言中函數(shù)返回值不一致問題如何解決”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“C語言中函數(shù)返回值不一致問題如何解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

    C語言函數(shù)返回值不一致

    在運(yùn)行成程序上有時會發(fā)現(xiàn)函數(shù)內(nèi)部的值與返回到主函數(shù)的值會相差很多出現(xiàn)隨機(jī)值,但是它們的地址卻相同!**一般的原因多是內(nèi)存污染,多發(fā)于函數(shù)返回?cái)?shù)組地址**或返回主函數(shù)后直接應(yīng)用。

    例如下面的兩個程序,不用關(guān)心它做了什么,只需觀察它們的不同點(diǎn)(已注釋)

    #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};       //關(guān)鍵?。。?nèi)存污染問題! 
    	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;
    }

    運(yùn)行如下:

    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 // !?。?/p>

    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}; !??!注意不同?。?!內(nèi)存污染問題!** 
    	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;
    }

    運(yùn)行如下:

    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; // !?。?!

    此示例運(yùn)用了分配內(nèi)存的方法cmalloc()函數(shù)來替代直接創(chuàng)建的數(shù)組。

    函數(shù)的返回值注意事項(xiàng)

    函數(shù)的返回值

    一般情況下,通過函數(shù)的調(diào)用,使調(diào)用函數(shù)可以獲得被調(diào)用函數(shù)的函數(shù)值,這個值就叫做返回值。

    注意事項(xiàng)

    ①、有的函數(shù)有返回值,有的函數(shù)沒有返回值,具體看函數(shù)的聲明類型,如果返回值類型為 void 則為無返回值類型;

    ②、函數(shù)的返回值是通過函數(shù)中的 return 語句獲得的。一個函數(shù)中可以有一個以上的return語句,執(zhí)行到哪個return就從哪個return返回了,return語句執(zhí)行完之后,他之后的代碼不會被執(zhí)行;

    ③、函數(shù)內(nèi)部的return返回值類型要與函數(shù)本身定義時候的返回值類型一致,即使不一致也是可以相互轉(zhuǎn)化的,最終以函數(shù)定義時候的返回值類型為主進(jìn)行轉(zhuǎn)化,若轉(zhuǎn)化不了則編譯期間就報(bào)錯了;

    ④、原則上一個函數(shù)只能有一個返回值,若要返回多個值則可以通過參數(shù)返回或者返回結(jié)構(gòu)類型等等。

    讀到這里,這篇“C語言中函數(shù)返回值不一致問題如何解決”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI