標籤:

二級C習題10.10為什麼選C?


C 和 D 都是錯誤的。

另外,請不要用 Tubro C 2.0 的運行結果來反駁我。


D也是錯的。

A string literal, also called a string constant, is a sequence of characters surrounded by double quotes as in "...". A string has type ``array of characters"" and storage class static (see Par.A.3 below) and is initialized with the given characters. Whether identical string literals are distinct is implementation-defined, and the behavior of a program that attempts to alter a string literal is undefined.


cd都不對。

c是在修改誰?

d是在修改常量。


D的錯跟C的錯不同,D答案是運行時錯,編譯沒問題,C會有編譯警告,如果純粹考慮語法那麼應該選C。(當然你執意認為C跟D都是錯的也可以,但無益於你的考試,反正你的目的應該是應付考試)

string literal 是const char *類型的量,const指針不能賦值給非const指針,所以題干中的str4賦值就錯了(此處應該有編譯錯誤或者編譯警告,取決於編譯器,我這裡會報告deprecated conversion from string constant to char*這個警告),而

D答案取決於編譯器,如果在str4報錯,有的編譯器會忽略後續所有str4有關的問題,於是D答案就沒錯了,錯在題干本身。

C答案則是未賦值的指針,如果編譯,C答案會報編譯警告(str3 is used uninitialized in this function),str4的定義行會報警告,D答案則沒有編譯警告或錯誤。

記住,只有const char *類型的指針才能賦值string literal,char*是不合適的,這是不好的編程習慣。

另外,不要用沒有正確實現語言標準的編譯器里的編譯結果來反駁我的觀點。


C,D全錯


C是錯的,沒有疑問,嘗試給一個空的指針複製絕對會報錯,D也是錯的,因為str4本身指向常量去,不能修改


DOS下C,D都不一定導致錯誤,有內存保護的OS下C一定導致錯誤,D則和編譯器鏈接器有關。


C肯定是錯的,不過這個題也是出的有問題,D也是錯的。不過你肯定是為了考試而學的C語言,否則也不會去選A - -

不要反駁D了,上面幾位都說的很明白了,我知道沒圖你們是不會相信的,雖然不提倡直接用char


有個問題大家討論下,我想d答案的使用可能也是對的。這取決於將這類字元串放入文本段並賦予不可變的性質是規範規定的還是規範沒有寫,但主流編譯器都這麼來優化。因此,c是肯定有問題的。

---------

靠譜回答,c語言的定義對string literal是否可變未做定義。c++定義其為常量。參見下貼。

http://stackoverflow.com/questions/2245664/what-is-the-type-of-string-literals-in-c-c



1,str1,str2 指向到stack; str3 是空指針;str4 是指向到TEXT seg.

2,strcpy只能作用在stack or heap.

所以C、D都是錯的。

至少我是這麼理解的,歡迎打臉。


C中 str3在定義時未初始化,指針指向的地址未知。

D也是錯的,str4指向一塊只讀的字元串常量的地址。


我一看到strcpy就想到overflow


CD兩項都是錯的. 你用的習題冊有問題.


推薦閱讀:

有必要在寫 C++ 時避免隱式轉換嗎?
C++中如何載入100K+的常數數組?
C++自學用書推薦?
自學計算機圖形學要哪些基礎?只用c語言可以嗎?
long Rq = 1432567; int *x; x = (int *)Rq; printf("%d",*x); 錯誤在哪裡?

TAG:C編程語言 | CC |