日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

char* 和char[] 内存分配的区别(转载)

發布時間:2024/4/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 char* 和char[] 内存分配的区别(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[cpp]?view plaincopy
  • char?*?s1?=?"abcd";??
  • s1[0]?=?'m';//segment?fault??
  • 上面代碼在gcc下編譯運行將報段錯誤。

    然而,

    ?

    [cpp]?view plaincopy
  • char?s1[]?=?"abcd";??
  • s1[0]?=?'m';??

  • 這段代碼則能夠正確運行。其中包含的原理是char* 和 char[],在內存分配上的機制差異。

    ?

    對于char *? s = "abcd";來說, 編譯器會將字符串字面量當作常量數據處理,存放在.rodata段,這樣以來,s將指向.rodata段中的某處內存,

    因此對該段內存的修改會引起段錯誤。(另,printf等格式化字符串函數中的format string 如"%d"等也會被放在.rodata中。)

    對于char s1[] = "abcd";來說,"abcd"是在棧上分配內存,使用mov指令直接將值寫入棧上對應內存。

    使用下面代碼來驗證上面的描述:

    ?

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • ??
  • int?main()??
  • {??
  • ????char?*?s1?=?"abcd";??
  • ????char?s2[]?=?"efghef";??
  • }??

  • 查看匯編指令:

    ?

    ?

    [plain]?view plaincopy
  • cString.o:?????file?format?elf32-i386??
  • ??
  • Contents?of?section?.text:??
  • ?0000?5589e583?e4f083ec?1065a114?00000089??U........e......??
  • ?0010?44240c31?c0c70424?00000000?c7442405??D$.1...$.....D$.??
  • ?0020?65666768?66c74424?096566c6?44240b00??efghf.D$.ef.D$..??
  • ?0030?8b54240c?65331514?00000074?05e8fcff??.T$.e3.....t....??
  • ?0040?ffffc9c3?????????????????????????????....??????????????
  • <span?style="color:#3333FF;">Contents?of?section?.rodata:??
  • ?0000?61626364?00??????????????????????????abcd.??</span>???????????
  • Contents?of?section?.comment:??
  • ?0000?00474343?3a202855?62756e74?752f4c69??.GCC:?(Ubuntu/Li??
  • ?0010?6e61726f?20342e35?2e322d38?7562756e??naro?4.5.2-8ubun??
  • ?0020?74753429?20342e35?2e3200?????????????tu4)?4.5.2.???????
  • ??
  • Disassembly?of?section?.text:??
  • ??
  • 00000000?<main>:??
  • ???0:???55??????????????????????push???%ebp??
  • ???1:???89?e5???????????????????mov????%esp,%ebp??
  • ???3:???83?e4?f0????????????????and????$0xfffffff0,%esp??
  • ???6:???83?ec?10????????????????sub????$0x10,%esp??
  • ???9:???65?a1?14?00?00?00???????mov????%gs:0x14,%eax??
  • ???f:???89?44?24?0c?????????????mov????%eax,0xc(%esp)??
  • ??13:???31?c0???????????????????xor????%eax,%eax??
  • ??15:???c7?04?24?00?00?00?00????movl???$0x0,(%esp)??
  • ?<span?style="color:#3333FF;">?1c:??c7?44?24?05?65?66?67????movl???$0x68676665,0x5(%esp)??
  • ??23:???68???
  • ??24:???66?c7?44?24?09?65?66????movw???$0x6665,0x9(%esp)</span>??
  • ??2b:???c6?44?24?0b?00??????????movb???$0x0,0xb(%esp)??
  • ??30:???8b?54?24?0c?????????????mov????0xc(%esp),%edx??
  • ??34:???65?33?15?14?00?00?00????xor????%gs:0x14,%edx??
  • ??3b:???74?05???????????????????je?????42?<main+0x42>??
  • ??3d:???e8?fc?ff?ff?ff??????????call???3e?<main+0x3e>??
  • ??42:???c9??????????????????????leave????
  • ??43:???c3??????????????????????ret????
  • 前面用藍色標出部分為char*聲明的字符串。后面藍色標出部分位char[]字符串數組。

    ?

    此外,對于函數如strcpy(s3,"abcd"),這樣的調用,參數傳入字符串常量的都是存儲在.rodata段中的。

    ?

    轉載于:https://www.cnblogs.com/leoluoisacoder/p/3724354.html

    總結

    以上是生活随笔為你收集整理的char* 和char[] 内存分配的区别(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。