亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2075 | 回復(fù): 8
打印 上一主題 下一主題

【請(qǐng)問(wèn)】關(guān)于字符串指針和字符數(shù)組的問(wèn)題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-12-13 16:13 |只看該作者 |倒序?yàn)g覽
今天在編程時(shí)發(fā)現(xiàn)這樣一個(gè)現(xiàn)象
char str1[]="abcd";
char str2[]="efgh";
*str1=*str2;
這個(gè)操作是合法的,結(jié)果也是正確的;

但是如果用字符串指針聲明:
char *str1="abcd";
char *str2="efgh";
*str1=*str2;
運(yùn)行時(shí)會(huì)出現(xiàn)內(nèi)存錯(cuò)誤

編譯的平臺(tái):gcc 3.2.2 以及dev-c++都試驗(yàn)過(guò)

比較疑惑,感謝大家的指教^^

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2008-12-13 19:10 |只看該作者
簡(jiǎn)單一點(diǎn)說(shuō), “abc”是const char *型的,數(shù)據(jù)放在只讀的內(nèi)存區(qū)。
而char[]在棧,可寫。

評(píng)分

參與人數(shù) 1可用積分 +1 收起 理由
samon_fu + 1 我很贊同

查看全部評(píng)分

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-12-13 19:14 |只看該作者
這個(gè)在《c專家編程》上面好像是說(shuō)的未定義呀~

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
4 [報(bào)告]
發(fā)表于 2008-12-13 20:18 |只看該作者
今天在編程時(shí)發(fā)現(xiàn)這樣一個(gè)現(xiàn)象
char str1[]="abcd";
char str2[]="efgh";
*str1=*str2;
這個(gè)操作是合法的,結(jié)果也是正確的;

這兩個(gè)字符串都是保存在棧上,可以修改其中的內(nèi)容。其中,*str1=*str2相當(dāng)于把str2字符串的第一個(gè)字符'e'賦給了str1的第一個(gè)字符,因此,str1就變成了"ebcd"
但是如果用字符串指針聲明:
char *str1="abcd";
char *str2="efgh";
*str1=*str2;
運(yùn)行時(shí)會(huì)出現(xiàn)內(nèi)存錯(cuò)誤

編譯的平臺(tái):gcc 3.2.2 以及dev-c++都試驗(yàn)過(guò)

以上兩個(gè)字符串都是存在于靜態(tài)內(nèi)存區(qū)域。對(duì)于該區(qū)域可以進(jìn)行讀操作,但是賦值的行為是不確定的。也就是成功與否未定義,不同的編譯器可能結(jié)果不一樣。
所以,不要進(jìn)行這樣的操作,因?yàn)槟悴恢肋@樣操作的確定性結(jié)果。

評(píng)分

參與人數(shù) 1可用積分 +1 收起 理由
samon_fu + 1 我很贊同

查看全部評(píng)分

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-12-13 21:38 |只看該作者
高人的見(jiàn)解!

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-12-13 21:47 |只看該作者
原帖由 Fixend 于 2008-12-13 19:10 發(fā)表
簡(jiǎn)單一點(diǎn)說(shuō), “abc”是const char *型的,數(shù)據(jù)放在只讀的內(nèi)存區(qū)。
而char[]在棧,可寫。

大哥,你搞笑呢

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-12-13 22:20 |只看該作者
原帖由 Fixend 于 2008-12-13 19:10 發(fā)表
簡(jiǎn)單一點(diǎn)說(shuō), “abc”是const char *型的,數(shù)據(jù)放在只讀的內(nèi)存區(qū)。
而char[]在棧,可寫。

我為剛才的發(fā)帖感到臉紅~~,你是對(duì)的,

        char str1[]="abcd";
        char str2[]="efgh";
        *str1=*str2;


的匯編代碼是:
        .file   "2x.c"
        .section        .rodata
.LC0:
        .string "abcd"
.LC1:
        .string "efgh"
        .text
.globl main
        .type   main, @function
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        subl    $16, %esp
        #put .LC0 in -9(%ebp) to -5(%ebp)
        movl    .LC0, %eax
        movl    %eax, -9(%ebp)
        movzbl  .LC0+4, %eax
        movb    %al, -5(%ebp)
        #put .LC1 in -14(%ebp) to -10(%ebp)
        movl    .LC1, %eax
        movl    %eax, -14(%ebp)
        movzbl  .LC1+4, %eax
        movb    %al, -10(%ebp)
        #*str1 = *str2
        #not arrange address ,but arrange the first char;
        movzbl  -14(%ebp), %eax
        movb    %al, -9(%ebp)
        # all done
        addl    $16, %esp
        popl    %ecx
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.2.3 (Debian 4.2.3-5)"
        .section        .note.GNU-stack,"",@progbits



        char *str1="abcd";
        char *str2="efgh";
        *str1=*str2;

的匯編代碼如下:
        .file   "3x.c"
        .section        .rodata
.LC0:
        .string "abcd"
.LC1:
        .string "efgh"
        .text
.globl main
        .type   main, @function
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        subl    $16, %esp
        movl    $.LC0, -12(%ebp)
        movl    $.LC1, -8(%ebp)
        movl    -8(%ebp), %eax
        movzbl  (%eax), %edx
        movl    -12(%ebp), %eax
        movb    %dl, (%eax)
        addl    $16, %esp
        popl    %ecx
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.2.3 (Debian 4.2.3-5)"
        .section        .note.GNU-stack,"",@progbits



聲明為指針的時(shí)候,在棧上保存的是str的存儲(chǔ)地址,而str是聲明在.rodata區(qū)的,

所以最后
                movl    -12(%ebp), %eax
                movb    %dl, (%eax)
相當(dāng)于嘗試把str2的首字符寫入 .rodata區(qū),所以就SIGSEGV了,

而聲明為char []的時(shí)候,其實(shí)就是把字符在棧上操作,因此能正常執(zhí)行,
雖然這種操作沒(méi)啥意義~~

評(píng)分

參與人數(shù) 1可用積分 +3 信譽(yù)積分 +2 收起 理由
samon_fu + 3 + 2 我很贊同,坦誠(chéng)交流

查看全部評(píng)分

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2008-12-13 22:20 |只看該作者
原帖由 Godbach 于 2008-12-13 20:18 發(fā)表

這兩個(gè)字符串都是保存在棧上,可以修改其中的內(nèi)容。其中,*str1=*str2相當(dāng)于把str2字符串的第一個(gè)字符'e'賦給了str1的第一個(gè)字符,因此,str1就變成了"ebcd"

以上兩個(gè)字符串都是存在于靜態(tài)內(nèi)存區(qū)域。對(duì)于該 ...





贊成!!

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2008-12-15 22:45 |只看該作者

回復(fù) #1 lqseu 的帖子

非常感謝大家^^
懂了
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP