最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言中函數(shù)返回值不一致問(wèn)題

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

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

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

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

#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)存污染問(wèn)題! 
	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 // ?。?!

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; // ?。。∽⒁?/p>

------------------------------------分割線-----------------------------------------

#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)存污染問(wèn)題!** 
	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 //?。。。?/p>

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ù)來(lái)替代直接創(chuàng)建的數(shù)組;

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

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

函數(shù)的返回值

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

注意事項(xiàng)

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Linux系統(tǒng)下C語(yǔ)言中的標(biāo)準(zhǔn)IO總結(jié)

    Linux系統(tǒng)下C語(yǔ)言中的標(biāo)準(zhǔn)IO總結(jié)

    最近用到了C語(yǔ)言的標(biāo)準(zhǔn)IO庫(kù),由于對(duì)其中的一些細(xì)節(jié)不是非常清楚,導(dǎo)致了許多Bug,花了好長(zhǎng)時(shí)間來(lái)調(diào)試,所以在此做個(gè)筆記,這篇文章主要給大家介紹了關(guān)于Linux系統(tǒng)下C語(yǔ)言中標(biāo)準(zhǔn)IO的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • c語(yǔ)言?數(shù)據(jù)存儲(chǔ)與原碼?反碼?補(bǔ)碼詳細(xì)解析

    c語(yǔ)言?數(shù)據(jù)存儲(chǔ)與原碼?反碼?補(bǔ)碼詳細(xì)解析

    不知道你是否和我一樣好奇,學(xué)習(xí)編程語(yǔ)言的同時(shí)想,各個(gè)數(shù)據(jù)類(lèi)型是怎樣在我們的內(nèi)存中儲(chǔ)存的呢,如果你仔細(xì)深入了解的話,你會(huì)了解其中的樂(lè)趣,了解科學(xué)家們的偉大,了解c語(yǔ)言
    2022-02-02
  • C++面向行輸入之get()與getline()實(shí)例詳解

    C++面向行輸入之get()與getline()實(shí)例詳解

    在c++里當(dāng)我們輸入一個(gè)字符串時(shí)習(xí)慣用cin,但是cin只能讀取一段不含空格的字符串,如果我們需要讀取一段包含空格的字符串時(shí),就需要用到getline()或get(),下面這篇文章主要給大家介紹了關(guān)于C++面向行輸入之get()與getline()的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • c/c++中struct定義、聲明、對(duì)齊方式解析

    c/c++中struct定義、聲明、對(duì)齊方式解析

    這篇文章通過(guò)C/C++的兩種聲明方式開(kāi)始,給大家詳細(xì)分析了/c+中struct定義、聲明、對(duì)齊方式,對(duì)此有興趣的朋友可以參考學(xué)習(xí)下。
    2018-03-03
  • 淺談Qt信號(hào)與槽的各種連接方式

    淺談Qt信號(hào)與槽的各種連接方式

    信號(hào)和槽是Qt特有的信息傳輸機(jī)制,本文主要介紹了淺談Qt信號(hào)與槽的各種連接方式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++實(shí)現(xiàn)二叉樹(shù)遍歷序列的求解方法

    C++實(shí)現(xiàn)二叉樹(shù)遍歷序列的求解方法

    這篇文章主要介紹了C++實(shí)現(xiàn)二叉樹(shù)遍歷序列的求解方法,需要的朋友可以參考下
    2014-08-08
  • wince禁止程序標(biāo)題欄上的退出按鈕示例

    wince禁止程序標(biāo)題欄上的退出按鈕示例

    這篇文章主要介紹了wince禁止程序標(biāo)題欄上的退出按鈕示例,需要的朋友可以參考下
    2014-02-02
  • va_list(),va_start(),va_arg(),va_end() 詳細(xì)解析

    va_list(),va_start(),va_arg(),va_end() 詳細(xì)解析

    這些宏定義在stdarg.h中,所以用到可變參數(shù)的程序應(yīng)該包含這個(gè)頭文件.下面我們寫(xiě)一個(gè)簡(jiǎn)單的可變參數(shù)的函數(shù),該函數(shù)至少有一個(gè)整數(shù)參數(shù),第二個(gè)參數(shù)也是整數(shù),是可選的.函數(shù)只是打印這兩個(gè)參數(shù)的值
    2013-09-09
  • C語(yǔ)言的分支和循環(huán)語(yǔ)句你真的了解嗎

    C語(yǔ)言的分支和循環(huán)語(yǔ)句你真的了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的分支和循環(huán)語(yǔ)句,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C語(yǔ)言的動(dòng)態(tài)內(nèi)存分配及動(dòng)態(tài)內(nèi)存分配函數(shù)詳解

    C語(yǔ)言的動(dòng)態(tài)內(nèi)存分配及動(dòng)態(tài)內(nèi)存分配函數(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的動(dòng)態(tài)內(nèi)存分配及動(dòng)態(tài)內(nèi)存分配函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03

最新評(píng)論

竹北市| 游戏| 达孜县| 淳安县| 辽阳市| 乌鲁木齐县| 乌海市| 霍林郭勒市| 蛟河市| 西畴县| 勃利县| 即墨市| 彰化市| 阜宁县| 正阳县| 大城县| 鄂托克旗| 绥化市| 苍山县| 南充市| 兴仁县| 泰宁县| 金山区| 文水县| 满洲里市| 淳安县| 垦利县| 林州市| 抚顺县| 宁城县| 兴义市| 古丈县| 米易县| 岫岩| 河北区| 册亨县| 太和县| 朝阳县| 松江区| 陕西省| 阳原县|