看到乙個某公司的面試題目如下:
char *getstr1(void)
char *getstr2(void)
問如果呼叫這兩個函式進行賦值的話,輸出的值分別為什麼?
如果不仔細想的話,回答是輸入的結果一樣:hello world!
然而非也,實驗證明以上的答案是錯的
函式getstr1返回值為輸出的亂碼,函式getstr2為hello world.
說明如下:
"hello world"作為靜態字串實際上儲存在資料區,但寫程式的人不知道這個位址,而程式本身知道。當某一函式以
方式使用此靜態字串時,實際上相當於:
char p[12];
strcpy(p, "hello world");
....
p[12]是在棧裡臨時分配的。雖然p指向的內容是"hello world", 但是這是複製品,不是原件。當函式結束,char p就被程式**了,所以p的內容就不再是"hello world"了。
但如果以char *p="hello world"的方式使用,p指向的是靜態字串儲存的位置,也就是說指向"hello world"的原件,當然沒有問題了。
如果想堅持用char p而不使用char *p, 有效方法必須是:
原因我想很清楚了。static char 是靜態的,儲存在資料區。
以上就涉及到了函式指標,在實現的程式設計當中也會經常使用的,如下
如果需要實現乙個字串的反轉函式,就可以用以下的**來實現
/*
*function: 實現對乙個字串的反轉
*/char *strrevse(char *value)
else
dest = (char *)malloc(len);
pdest = dest;
psrc = src+len-1;
while(*psrc != 0)
return dest;
}
測試函式
int main(void)
乙個有趣的指標問題
是從網上看到的乙個例子 struct s int i int p void main struct s s int p s.i p 0 4 p 1 3 s.p p s.p 1 1 s.p 0 2 問程式會在哪一行死掉 解答 程式執行到最後一行就會報出異常,死掉.具體解答為 首先需要說明的是結構體s,...
關於指標的乙個小問題
任務 c primer 4th 習題5.18 編寫程式定義乙個vector物件,其每個元素都是指向string型別的指標,讀取該vector物件,輸出每個string的內容及其相應的長度。自己的方法 string s string sarr 10 vector內的每個元素都是指向string型別的指...
乙個函式過載問題
今天下午在看c primer plus時遇到乙個疑問 請教個問題,乙個類的2個類方法宣告為 為什麼沒有產生重定義錯誤?double operator int i double operator int i const 比如class student student ada 3 ada 1 ada 3...