看你的代碼。

成都創(chuàng)新互聯(lián)專(zhuān)注于環(huán)翠網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供環(huán)翠營(yíng)銷(xiāo)型網(wǎng)站建設(shè),環(huán)翠網(wǎng)站制作、環(huán)翠網(wǎng)頁(yè)設(shè)計(jì)、環(huán)翠網(wǎng)站官網(wǎng)定制、小程序定制開(kāi)發(fā)服務(wù),打造環(huán)翠網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供環(huán)翠網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
你問(wèn)題并不在數(shù)組傳入。你函數(shù)mymd5接收password數(shù)組,mymd5的password數(shù)組變量和外部函數(shù)的password地址相同,所以改變其中外部函數(shù)的數(shù)組也改變。
但你mymd5返回的數(shù)組decrypt,是局部變量,當(dāng)mymd5調(diào)用結(jié)束,這個(gè)數(shù)組的內(nèi)存空間就釋放了。你接收了也是NULL。所以要用malloc或calloc申請(qǐng)動(dòng)態(tài)內(nèi)存。這樣不會(huì)被釋放。
我寫(xiě)了簡(jiǎn)單案例,你參考:
#includestdio.h
#includemalloc.h
#includestring.h
char?*md(char?a[]);//錯(cuò)誤的數(shù)組返回
char?*md2(char?a[]);//正確的數(shù)組返回
int?main()
{
char?password[10]="123456789",*decrypt=NULL;
decrypt=md(password);
printf("外部函數(shù)傳遞數(shù)組到子函數(shù),子函數(shù)改變,外部函數(shù)也改變,password=%s\n",password);
printf("錯(cuò)誤返回方式:局部變量,外部函數(shù)接收失敗,被自動(dòng)釋放,decrypt=%s\n",decrypt);
decrypt=md2(password);
printf("正確返回方式:動(dòng)態(tài)申請(qǐng),外部函數(shù)接收成功,不會(huì)被自動(dòng)釋放,decrypt=%s\n",decrypt);
return?0;
}
char?*md(char?password[])
{
char?decrypt[10]="*********";
password[0]=0,strcpy(password,"abcdefghi");
return?decrypt;
}
char?*md2(char?password[])
{
char?*decrypt=(char?*)malloc(sizeof(char)*10);
if(!decrypt)
return?NULL;
strcpy(decrypt,"*********");
password[0]=0,strcpy(password,"abcdefghi");
return?decrypt;
}
1、因?yàn)閿?shù)組在內(nèi)存中是一塊連續(xù)的內(nèi)存,只要將該數(shù)組的首地址傳進(jìn)去,當(dāng)然就可以訪問(wèn)整個(gè)數(shù)組了。值得注意的是,由于只傳了首地址,函數(shù)不知道數(shù)組的維數(shù),所以還得把數(shù)組的維數(shù)傳進(jìn)去,那就可以完全操作該數(shù)組了。
2、例:有一個(gè)函數(shù)聲明:void fun( int aa[],int size );或者void fun( int *pa,int size );
以上兩種聲明都一樣。
調(diào)用上訴函數(shù)時(shí):假設(shè)有 int ab[10];
fun( ab,10 )就可以了。
1、因?yàn)檩斎霐?shù)據(jù)是局部變量。需要使用全局變量或者傳入函數(shù)參數(shù)。
2、全局變量也稱(chēng)為外部變量,它是在函數(shù)外部定義的變量。
它不屬于哪一個(gè)函數(shù),它屬于一個(gè)源程序文件。其作用域是整個(gè)源程序。在函數(shù)中使用全局變量,一般應(yīng)作全局變量說(shuō)明。
只有在函數(shù)內(nèi)經(jīng)過(guò)說(shuō)明的全局變量才能使用。全局變量的說(shuō)明符為extern。
但在一個(gè)函數(shù)之前定義的全局變量,在該函數(shù)內(nèi)使用可不再加以說(shuō)明。外部變量是在函數(shù)外部定義的全局變量,它的作用域是從變量的定義處開(kāi)始,到本程序文件的
結(jié)尾。在此作用域內(nèi),全局變量可為各個(gè)函數(shù)所引用。編譯時(shí)將外部變量分配在靜態(tài)存儲(chǔ)區(qū)。
有時(shí)需要在其他文件中使用extern來(lái)聲明外部變量,以擴(kuò)展外部變量的作用域。
也可用static聲明外部變量,使該變量不能被其他文件引用。有時(shí)候他們是一樣的,只有稍微一點(diǎn)的區(qū)別而已,不用太過(guò)于區(qū)分的。
3、定義及引用方法:
#ifdef xxx_GLOBALS
#define xxx_EXT#else#define xxx_EXT extern
#endif 上面位于.H 文件中,每個(gè)全局變量都加上了xxx_EXT的前綴,xxx代表模塊的名字。該模塊的.C文件中有以下定義:#define xxx_GLOBALS
當(dāng)編譯器處理.C文件時(shí),它強(qiáng)制xxx_EXT(在相應(yīng).H文件中可以找到)為空,(因?yàn)閤xx_GLOBALS已經(jīng)定義)。所以編譯器給每個(gè)全局變量分配內(nèi)存空間,而當(dāng)編譯器處理其他.C文件時(shí),xxx_GLOBAL沒(méi)有定義,xxx_EXT被定義為extern,這樣用戶就可以調(diào)用外部全局變量。進(jìn)階:在abc.H:#ifdef abc_GLOBALS
#define abc_EXT#else
#define abc_EXT extern#endif
abc_EXT unsigned int Ctr;
同時(shí),abc.H有中以下定義:#define abc_GLOBALS
當(dāng)編譯器處理abc.C時(shí),它使得頭文件變成如下所示,因?yàn)閍bc_EXT被設(shè)置為空。unsigned int Ctr;
這樣編譯器就會(huì)將這些全局變量分配在內(nèi)存中。當(dāng)編譯器處理其他.C文件時(shí),頭文件變成了如下的樣子,因?yàn)閍bc_GLOBAL沒(méi)有定義,所以abc_EXT被定義為extern。extern unsigned int Ctr;
在這種情況下,不產(chǎn)生內(nèi)存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H 文件中定義一次就可以了。
數(shù)組參數(shù)屬于指針參數(shù).
指針參數(shù)即時(shí)傳址參數(shù)(或叫引用參數(shù)), 如果想在函數(shù)中修改參數(shù)的值, 這是唯一的途徑.
如果把數(shù)組當(dāng)作參數(shù), 不管你愿意與否, 它就是指針, 指向第一個(gè)值的指針.
1. 數(shù)組參數(shù)就是指向第一個(gè)元素的指針: #include stdio.h
void getArr(int p[], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int p[], int si) {
int i;
for (i = 0; i si; i++) {
printf("%d\n", p[i]);
}
}
2. 干脆直接聲明為指針: #include stdio.h
void getArr(int *p, int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int *p, int si) {
int i;
for (i = 0; i si; i++) {
printf("%d\n", p[i]);
}
}
3. 即使你在形參中指定維數(shù)也不起作用: #include stdio.h
void getArr(int p[2], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int p[2], int si) {
int i;
for (i = 0; i si; i++) {
printf("%d\n", p[i]);
}
}
4. 既然是指針, 其值就有被修改的可能: #include stdio.h
void getArr(int p[], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
size_t i;
getArr(ns, sizeof(ns)/sizeof(ns[0]));
for (i = 0; i sizeof(ns)/sizeof(ns[0]); i++) {
printf("%d\n", *(ns+i));
}
getchar();
return 0;
}
void getArr(int p[], int si) {
int i;
for (i = 0; i si; i++) {
p[i]++;
}
}
5. 如果是字符數(shù)組, 它自己能判斷數(shù)組尾界: #include stdio.h
void getArr(char p[]);
int main(void)
{
char ns[] = "ABCDEFG";
getArr(ns);
getchar();
return 0;
}
void getArr(char p[]) {
int i;
for (i = 0; p[i]; i++) {
printf("%c: %d\n", p[i], p[i]);
}
}
static char* parameters[]={}; 你這句不能通過(guò)編譯,因?yàn)槟阌昧藍(lán)}, 花括號(hào)里沒(méi)東西,沒(méi)辦法確定[]里的數(shù)值是幾(初始化錯(cuò)誤)。
你可以改成:
static char* parameters[10]; //假定指針數(shù)組有10個(gè)元素。
注意,你聲明的是指針數(shù)組,它們沒(méi)有存放字符串的內(nèi)存單元,只有存放指向的地址的能力。
所以程序里要提供 存放字符串的地方。如果沒(méi)有提供,你的輸出就是空白。
程序例子:
#include stdio.h
static char* parameters[10];
void f1(){
static char s[ ]="abcd1234"; //存放字符串的地方,函數(shù)調(diào)用完畢時(shí),單元依然存在
parameters[0]= s;
}
void f2(){
static char s[ ]="xyz5678"; //存放字符串的地方,函數(shù)調(diào)用完畢時(shí),單元依然存在
parameters[1]=s;
f1(); // 調(diào)函數(shù) f1
}
main(){
int i;
f2(); //調(diào)函數(shù) f2,f2 調(diào)函數(shù)f1
for (i=0;i2;i++) printf("%s\n",parameters[i]); // 輸出2個(gè)字符串
return 0;
}
輸出:
abcd1234
xyz5678
分享文章:c語(yǔ)言自定義函數(shù)傳入數(shù)據(jù),c語(yǔ)言引入數(shù)據(jù)類(lèi)型的目的
分享路徑:http://chinadenli.net/article28/hshcjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)