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