欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2023年02月24日 09:42:13   作者:雪.痕  
這篇文章主要介紹了C語言中函數(shù)返回值不一致問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

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

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

例如下面的兩個程序,不用關(guā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;
}

運行如下:

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;
}

運行如下:

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

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

這是我在學習是遇到的小陷阱,根據(jù)電腦系統(tǒng)與編譯器的不同可能不會出錯,具體污染原因還是沒有整明白。還是要注意留心。

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

函數(shù)的返回值

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

注意事項

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

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

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

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

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C/C++內(nèi)存管理詳情

    C/C++內(nèi)存管理詳情

    這篇文章主要通過描述了C/C++內(nèi)存分布、C/C++的一些函數(shù)理方面來展開C/C++內(nèi)存管理的內(nèi)容,需要的朋友請參考下文
    2021-08-08
  • C++中String類常見題目分享

    C++中String類常見題目分享

    這篇文章主要為大家詳細介紹了一些C++中String類的常見題目,文中的示例代碼講解詳細,對我們掌握C++有一定的幫助,感興趣的小伙伴可以了解一下
    2023-06-06
  • C++實現(xiàn)簡易貪吃蛇游戲

    C++實現(xiàn)簡易貪吃蛇游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡易貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語言二維數(shù)組中的查找的實例

    C語言二維數(shù)組中的查找的實例

    這篇文章主要介紹了C語言二維數(shù)組中的查找的實例的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C語言入門之浮點數(shù)

    C語言入門之浮點數(shù)

    這篇文章主要為大家介紹了C語言的浮點數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C語言實現(xiàn)貪吃蛇游戲(單人版)

    C語言實現(xiàn)貪吃蛇游戲(單人版)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)貪吃蛇游戲單人版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • c++11中regex正則表達式示例簡述

    c++11中regex正則表達式示例簡述

    這篇文章主要給大家介紹了關(guān)于c++11中regex正則表達式的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用c++11具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-11-11
  • 如何把C++的源代碼改寫成C代碼的方法

    如何把C++的源代碼改寫成C代碼的方法

    這篇文章主要介紹了如何把C++的源代碼改寫成C代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • C++代碼實現(xiàn)貪吃蛇小游戲

    C++代碼實現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C++貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語言實現(xiàn)頁面置換 先進先出算法(FIFO)

    C語言實現(xiàn)頁面置換 先進先出算法(FIFO)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)頁面置換,先進先出算法(FIFO),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評論