第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

修改C字符串常量?

修改C字符串常量?

C
楊魅力 2019-08-28 15:15:45
修改C字符串常量?我想編寫一個(gè)函數(shù)來反轉(zhuǎn)傳遞給它的給定字符串。但是我不能。如果我doReverse使用字符數(shù)組提供函數(shù)(參見下面的代碼),我的代碼運(yùn)行良好。我無法弄清楚為什么這不起作用。我能夠訪問str[0]的doReverse,但我不能用一個(gè)字符指針改變數(shù)組中的任意值。有任何想法嗎?void doReverse(char *str) {     str[0] = 'b';}void main(void) {     char *str = "abc";     doReverse(str);     puts(str);}更新:我知道如何通過將字符數(shù)組傳遞給它來編寫反向函數(shù):void reverse1(char p[]) {     int i, temp, y;     for (i = 0, y = strlen(p); i < y; ++i, --y) {         temp = p[y-1];         p[y-1] = p[i];         p[i] = temp;     }}但是,我想編寫另一個(gè)獲取char指針作為參數(shù)的版本。
查看完整描述

3 回答

?
莫回?zé)o

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


查看完整回答
反對 回復(fù) 2019-08-28
?
慕村225694

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ù)組大小,則可能會遇到麻煩。


查看完整回答
反對 回復(fù) 2019-08-28
?
江戶川亂折騰

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í)順利。


查看完整回答
反對 回復(fù) 2019-08-28
  • 3 回答
  • 0 關(guān)注
  • 519 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號