#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
/*輸入兩個字串a和b,
輸入一個整數f,在f處
將b添加進a,然后輸出
新的a*/
main(){
char *func(char[],char[],int);
char a[80],b[80],*c;
int f;
scanf("%s",a);
scanf("%s",b);
scanf("%d",&f);
c=func(a,b,f);
printf("c2==%s",c);//這里作為結果輸出了一次
}
char *func(char a[80],char b[80],int f){
char c[160];char *p;p=c;
int i;
for(i=0;i<f;i++){
c[i]=a[i];
}
for(int j=0;b[j]!='\0';j++){
c[i++]=b[j];
}
for(;a[f]!='\0';f++){
c[i++]=a[f];
}
c[i]='\0';
printf("c1==%s\n",c);//這里為了檢驗輸出了一次
return c;
}
win8,dev c++。
程式很簡單,但我輸出一直不對。
如果子函式里跟著輸出,那結果是對的,如圖:
算了,圖傳不上來,我寫出來,意思意思看吧。
輸入a:aaaaaa
輸入b:111
輸入f:3
結果:c1=aaa111aaa
c2=aaa111aaa
這說明我主函式里的*c接收到了子函式c[160]的資料。
但如果我把子函式里的printf注釋掉,結果就變成了:
輸入a:aaaaaa
輸入b:111
輸入f:3
結果:c2=
c2就輸出不了了。但如果我在主函式里輸出*c,結果又確實是a,*(c+4)也的確是1,這說明
c[160]的資料還是傳到了*c的,但為什么輸出不了呢?是我的輸出方法有問題嗎?
如果有問題,那為什么在不注釋子函式的printf情況下又是可以輸出呢?
子函式回傳p也是同樣的效果。
求大神解答為什么。
uj5u.com熱心網友回復:
你回傳了函式內部區域變數的地址了,出現什么結果都是可能的uj5u.com熱心網友回復:
char c[160]是區域變數,具有自動存盤期,但函式退出時,其地址所存盤的內容可能被擦除。你在函式內列印了一次,能夠正常顯示,應該是未定義的,系統并不做此保證。
當函式內未列印時,回傳的這個地址很可能已經被寫入了別的內容。
uj5u.com熱心網友回復:
可我在主函式里輸出*c的時候,內容確實是a,甚至*c+4也是1,如果因為是區域變數而沒得到資料的話,*c不該有值。在*c明明有值的情況下,printf %s卻不能輸出資料,實在是沒搞懂
uj5u.com熱心網友回復:
嗯,確實是沒有想到是因為區域變數的問題。我也想過在主函式里定義陣列c再把地址傳到子函式,但一則不想改,二則實在想知道為什么輸出不對。但若是因為區域變數被消除的原因,為什么在不注釋子函式printf的情況下,輸出又是對的呢
uj5u.com熱心網友回復:
出現什么結果都是可能的,還是按規范去寫代碼吧
uj5u.com熱心網友回復:
哦,我知道了。是這樣的,程式運行時,需要將代碼鏈接進堆疊。例如printf需要將庫函式鏈接行程式的堆疊,第二次呼叫時,可以復用這段代碼。
你如果沒在函式中加入printf,那么在主函式第一次呼叫printf時,printf的代碼,覆寫了你原來的堆疊。
所以找不到原來的資料了。
你可以測驗,在別處先呼叫一回printf,就能得到你想要的結果。
當然這個效果依然是未定義,系統并不做此保證。
uj5u.com熱心網友回復:
哦,我知道了。是這樣的,程式運行時,需要將代碼鏈接進堆疊。
例如printf需要將庫函式鏈接行程式的堆疊,第二次呼叫時,可以復用這段代碼。
你如果沒在函式中加入printf,那么在主函式第一次呼叫printf時,printf的代碼,覆寫了你原來的堆疊。
所以找不到原來的資料了。
你可以測驗,在別處先呼叫一回printf,就能得到你想要的結果。
當然這個效果依然是未定義,系統并不做此保證。
并沒有用,我在主函式里和子函式里都加了printf一個空格,還是老樣子。甚至把子函式原來的printf改掉讓他不輸出c[160]也得不到結果,哦,把輸出陣列c改成輸出指標p倒是沒影響,return的是c還是p也沒影響。
不過如果在注釋掉子函式的情況下,在主函式的printf后面再加一個printf *c,*c就接收不到資料了。如果主函式僅有一個printf去輸出*c,倒是有資料。這可能是因為所謂“覆寫”的關系。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/110129.html
標籤:C語言
上一篇:用VS2019 創建C++ Source File 源程式 失敗,請問我哪做錯了?
下一篇:小白求助c++解決找零錢問題
