3 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
最簡單的解決方案是將聲明更改str
為
char str[] = "abc";
這使得str
一個(gè)char數(shù)組被初始化為字符串“abc”。目前,您已將str
初始化為指針的指針指向由字符串文字描述的字符串。有一個(gè)關(guān)鍵的區(qū)別:字符串文字是只讀的,以便編譯器在存儲它們的位置具有最大的靈活性; 修改它們是UB。但是char數(shù)組是可變的,因此可以修改它們。
PS。main()
返回一個(gè)int
。

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
既然你正在讀考試,我會充實(shí)我的評論,以解釋實(shí)際發(fā)生的事情:
char *str = "abc";
str
是存儲在堆棧中的指針。它被初始化為指向文字字符串"abc"
。該文字字符串將存儲在已編譯可執(zhí)行文件的數(shù)據(jù)部分中,并在加載程序時(shí)加載到內(nèi)存中。該部分內(nèi)存是只讀的,因此當(dāng)您嘗試修改str指向的數(shù)據(jù)時(shí),會出現(xiàn)訪問沖突。
char* str = malloc(sizeof(char) * 4);strcpy(str, "abc");
這里,str是與第一個(gè)例子相同的堆棧指針。這次,它被初始化為指向堆上的4個(gè)字符的內(nèi)存塊,您可以讀取和寫入。起初,該內(nèi)存塊未初始化,可以包含任何內(nèi)容。strcpy讀取存儲“abc”的只讀存儲器塊,并將其復(fù)制到str指向的讀寫存儲器塊中。請注意,設(shè)置str[3] = '\0'
是多余的,因?yàn)閟trcpy已經(jīng)這樣做了。
順便說一下,如果您在visual studio中工作,請使用strcpy_s來確保在復(fù)制的字符串超出預(yù)期時(shí)不覆蓋緩沖區(qū)。
char str[] = "abc";
現(xiàn)在str
是一個(gè)在堆棧上分配的數(shù)組。編譯器將使其大小完全符合用于初始化它的字符串文字(包括NULL終止符)。堆棧存儲器是讀寫的,因此您可以根據(jù)需要修改陣列中的值。
char str[4] = "abc";
這與前一版本實(shí)際上是一樣的,只是告訴編譯器你知道的數(shù)據(jù)應(yīng)該比數(shù)組的長度更好。如果更改字符串而不是數(shù)組大小,則可能會遇到麻煩。

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
勛爵,勛爵。對于那些建議實(shí)際進(jìn)行交換的人,請仔細(xì)閱讀問題; 沒有什么比重申一個(gè)已經(jīng)非常明確的問題更糟的了。無論用于實(shí)現(xiàn)交換的方法(臨時(shí)交換,xor3交換等),這個(gè)人似乎都非常熟悉函數(shù)的基本內(nèi)容和相當(dāng)基本的內(nèi)在函數(shù)。
但是,如前所述,編譯器/鏈接器通常將所有字符串文字放在目標(biāo)可執(zhí)行文件的“const數(shù)據(jù)段”中,隨后在適當(dāng)?shù)摹凹虞d/執(zhí)行”調(diào)用期間將其與不可寫的MMU描述符相關(guān)聯(lián)。隨后通過此描述符發(fā)出的所有CPU寫周期都會被MMU的異常機(jī)制自動(dòng)捕獲,從而產(chǎn)生強(qiáng)制性的“段錯(cuò)誤”或特定于平臺的等價(jià)物。當(dāng)然,不言而喻,較舊的非MMU平臺不會出現(xiàn)這種行為。
雖然這有效地獲得了對源語言的“常量/文字”習(xí)慣的運(yùn)行時(shí)支持,但是一些平臺在歷史上促進(jìn)了顯式編譯時(shí)段的覆蓋。然而,這種支持水平逐漸減弱,有利于更嚴(yán)格/更強(qiáng)大的抽象層,從而使許多明顯且通常有用的優(yōu)化變得難以理解。隨著時(shí)間和磨損逐漸老化“MC / ASM”理念,在一個(gè)過于熱切的“微軟”一代之前,程序員不再被認(rèn)為具有足夠的知識或負(fù)責(zé)任以做出這種決定。代替我作為項(xiàng)目負(fù)責(zé)人目睹的許多人為的,而不是創(chuàng)造性的實(shí)施,這絕不是一件壞事。
盡管這篇文章正在迅速演變成一個(gè)偏離主題的違規(guī)行為,但我仍然感到有些自上而下的相關(guān)問題在我們的行業(yè)中逐漸流行起來。作為一個(gè)初出茅廬的C程序員 - 一種最初旨在補(bǔ)充低級開發(fā)的語言 - 我的建議是采用自下而上的方法,并通過一些課外匯編語言開發(fā)來增強(qiáng)你的學(xué)習(xí)。由于算法實(shí)現(xiàn)可能構(gòu)成您作為應(yīng)用工程師的主要關(guān)注點(diǎn),因此重要的是要記住當(dāng)代CPU設(shè)計(jì)在過去30年中經(jīng)歷了均勻演變; 今天的超快英特爾CPU只不過是我在地球還很年輕的時(shí)候編程的4/8位雙極性處理器的超標(biāo)量CMOS改進(jìn)。
與流行的看法相反,匯編語言編程相對容易學(xué)習(xí),并且在嘗試協(xié)調(diào)高級構(gòu)造與有問題或深?yuàn)W的行為時(shí)絕對必要。一旦你考慮了無數(shù)個(gè)小時(shí)的實(shí)驗(yàn),調(diào)試,網(wǎng)絡(luò)搜索和論壇垃圾郵件,毫無疑問,自下而上的方法肯定是阻力最小的途徑。
祝你學(xué)習(xí)順利。
- 3 回答
- 0 關(guān)注
- 519 瀏覽
添加回答
舉報(bào)