Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于c语言中文字字符串的内存分配问题_C_Memory_String Literals - Fatal编程技术网

关于c语言中文字字符串的内存分配问题

关于c语言中文字字符串的内存分配问题,c,memory,string-literals,C,Memory,String Literals,我是一个刚开始用C语言学习计算机系统的学生 我有一个关于文字字符串的内存分配工作原理的问题 我尝试使用以下代码分析如何在内存系统中分配字符串文字: #include <stdio.h> int main(){ char *p = "1"; printf("%s\n", p); printf("%p\n", p); p = "2"; printf("%s\n&qu

我是一个刚开始用C语言学习计算机系统的学生

我有一个关于文字字符串的内存分配工作原理的问题

我尝试使用以下代码分析如何在内存系统中分配字符串文字:

#include <stdio.h>

int main(){
   char *p = "1";
   printf("%s\n", p);
   printf("%p\n", p);

   p = "2";
   printf("%s\n", p);
   printf("%p\n", p);

   p = "3";
   printf("%s\n", p);
   printf("%p\n", p);

   p = "4";
   printf("%s\n", p);
   printf("%p\n", p);
}
根据我的学习经验,上面所有字符串的大小都是2(包括\0),因此分配给它们的空间也必须是2

从字符串“2”到“4”,内存按预期分配,但在“1”之后分配“2”时,系统产生了8位大小的间隙


这两个字符串之间是否分配了某些内容?或者系统有什么理由这样分配字符串?

间距也包括printf格式字符串:

0000000000404000 "1\0"
0000000000404002 "%s\n\0"
0000000000404006 "%p\n\0"
000000000040400A "2\0"
000000000040400C "3\0"
000000000040400E "4\0"

请注意,字符串的显示顺序与它们在源代码中的显示顺序相同,但printf格式字符串不会在每次调用中重复。由于字符串相同,它们只需在可执行文件中出现一次。

间距也包括printf格式字符串:

0000000000404000 "1\0"
0000000000404002 "%s\n\0"
0000000000404006 "%p\n\0"
000000000040400A "2\0"
000000000040400C "3\0"
000000000040400E "4\0"

请注意,字符串的显示顺序与它们在源代码中的显示顺序相同,但printf格式字符串不会在每次调用中重复。由于字符串是相同的,它们只需要在可执行文件中出现一次。

但位大小并不总是“8位”,这取决于操作系统

我们可以将可执行文件诊断为代码段,以获得其地址分配

查看CentOS的结果,如下所示,
部分中的
添加
操作显示了更多详细信息

[root@localhost zz]# ./a.out 
1
0x4006e8
2
0x4006f8
3
0x400700
4
0x400708
[root@localhost zz]# objdump -d a.out

a.out:     file format elf64-littleaarch64


Disassembly of section .init:

0000000000400408 <_init>:
  400408:       a9bf7bfd        stp     x29, x30, [sp,#-16]!
  40040c:       910003fd        mov     x29, sp
  400410:       94000032        bl      4004d8 <call_weak_fn>
  400414:       a8c17bfd        ldp     x29, x30, [sp],#16
  400418:       d65f03c0        ret

Disassembly of section .plt:

0000000000400420 <.plt>:
  400420:       a9bf7bf0        stp     x16, x30, [sp,#-16]!
  400424:       f00000f0        adrp    x16, 41f000 <__FRAME_END__+0x1e8f4>
  400428:       f947fe11        ldr     x17, [x16,#4088]
  40042c:       913fe210        add     x16, x16, #0xff8
  400430:       d61f0220        br      x17
  400434:       d503201f        nop
  400438:       d503201f        nop
  40043c:       d503201f        nop

0000000000400440 <__libc_start_main@plt>:
  400440:       90000110        adrp    x16, 420000 <__libc_start_main@GLIBC_2.17>
  400444:       f9400211        ldr     x17, [x16]
  400448:       91000210        add     x16, x16, #0x0
  40044c:       d61f0220        br      x17

0000000000400450 <__gmon_start__@plt>:
  400450:       90000110        adrp    x16, 420000 <__libc_start_main@GLIBC_2.17>
  400454:       f9400611        ldr     x17, [x16,#8]
  400458:       91002210        add     x16, x16, #0x8
  40045c:       d61f0220        br      x17

0000000000400460 <abort@plt>:
  400460:       90000110        adrp    x16, 420000 <__libc_start_main@GLIBC_2.17>
  400464:       f9400a11        ldr     x17, [x16,#16]
  400468:       91004210        add     x16, x16, #0x10
  40046c:       d61f0220        br      x17

0000000000400470 <puts@plt>:
  400470:       90000110        adrp    x16, 420000 <__libc_start_main@GLIBC_2.17>
  400474:       f9400e11        ldr     x17, [x16,#24]
  400478:       91006210        add     x16, x16, #0x18
  40047c:       d61f0220        br      x17

0000000000400480 <printf@plt>:
  400480:       90000110        adrp    x16, 420000 <__libc_start_main@GLIBC_2.17>
  400484:       f9401211        ldr     x17, [x16,#32]
  400488:       91008210        add     x16, x16, #0x20
  40048c:       d61f0220        br      x17

Disassembly of section .text:

0000000000400490 <_start>:
  400490:       d280001d        mov     x29, #0x0                       // #0
  400494:       d280001e        mov     x30, #0x0                       // #0
  400498:       910003fd        mov     x29, sp
  40049c:       aa0003e5        mov     x5, x0
  4004a0:       f94003e1        ldr     x1, [sp]
  4004a4:       910023e2        add     x2, sp, #0x8
  4004a8:       910003e6        mov     x6, sp
  4004ac:       580000a0        ldr     x0, 4004c0 <_start+0x30>
  4004b0:       580000c3        ldr     x3, 4004c8 <_start+0x38>
  4004b4:       580000e4        ldr     x4, 4004d0 <_start+0x40>
  4004b8:       97ffffe2        bl      400440 <__libc_start_main@plt>
  4004bc:       97ffffe9        bl      400460 <abort@plt>
  4004c0:       00400594        .word   0x00400594
  4004c4:       00000000        .word   0x00000000
  4004c8:       00400638        .word   0x00400638
  4004cc:       00000000        .word   0x00000000
  4004d0:       004006b8        .word   0x004006b8
  4004d4:       00000000        .word   0x00000000

00000000004004d8 <call_weak_fn>:
  4004d8:       f00000e0        adrp    x0, 41f000 <__FRAME_END__+0x1e8f4>
  4004dc:       f947f000        ldr     x0, [x0,#4064]
  4004e0:       b4000040        cbz     x0, 4004e8 <call_weak_fn+0x10>
  4004e4:       17ffffdb        b       400450 <__gmon_start__@plt>
  4004e8:       d65f03c0        ret
  4004ec:       00000000        .inst   0x00000000 ; undefined

00000000004004f0 <deregister_tm_clones>:
  4004f0:       90000100        adrp    x0, 420000 <__libc_start_main@GLIBC_2.17>
  4004f4:       9100e000        add     x0, x0, #0x38
  4004f8:       90000101        adrp    x1, 420000 <__libc_start_main@GLIBC_2.17>
  4004fc:       9100e021        add     x1, x1, #0x38
  400500:       eb00003f        cmp     x1, x0
  400504:       540000a0        b.eq    400518 <deregister_tm_clones+0x28>
  400508:       90000001        adrp    x1, 400000 <_init-0x408>
  40050c:       f9436c21        ldr     x1, [x1,#1752]
  400510:       b4000041        cbz     x1, 400518 <deregister_tm_clones+0x28>
  400514:       d61f0020        br      x1
  400518:       d65f03c0        ret
  40051c:       d503201f        nop

0000000000400520 <register_tm_clones>:
  400520:       90000100        adrp    x0, 420000 <__libc_start_main@GLIBC_2.17>
  400524:       9100e000        add     x0, x0, #0x38
  400528:       90000101        adrp    x1, 420000 <__libc_start_main@GLIBC_2.17>
  40052c:       9100e021        add     x1, x1, #0x38
  400530:       cb000021        sub     x1, x1, x0
  400534:       9343fc21        asr     x1, x1, #3
  400538:       8b41fc21        add     x1, x1, x1, lsr #63
  40053c:       9341fc21        asr     x1, x1, #1
  400540:       b40000c1        cbz     x1, 400558 <register_tm_clones+0x38>
  400544:       90000002        adrp    x2, 400000 <_init-0x408>
  400548:       f9437042        ldr     x2, [x2,#1760]
  40054c:       b4000062        cbz     x2, 400558 <register_tm_clones+0x38>
  400550:       d61f0040        br      x2
  400554:       d503201f        nop
  400558:       d65f03c0        ret
  40055c:       d503201f        nop

0000000000400560 <__do_global_dtors_aux>:
  400560:       a9be7bfd        stp     x29, x30, [sp,#-32]!
  400564:       910003fd        mov     x29, sp
  400568:       f9000bf3        str     x19, [sp,#16]
  40056c:       90000113        adrp    x19, 420000 <__libc_start_main@GLIBC_2.17>
  400570:       3940e260        ldrb    w0, [x19,#56]
  400574:       35000080        cbnz    w0, 400584 <__do_global_dtors_aux+0x24>
  400578:       97ffffde        bl      4004f0 <deregister_tm_clones>
  40057c:       52800020        mov     w0, #0x1                        // #1
  400580:       3900e260        strb    w0, [x19,#56]
  400584:       f9400bf3        ldr     x19, [sp,#16]
  400588:       a8c27bfd        ldp     x29, x30, [sp],#32
  40058c:       d65f03c0        ret

0000000000400590 <frame_dummy>:
  400590:       17ffffe4        b       400520 <register_tm_clones>

0000000000400594 <main>:
  400594:       a9be7bfd        stp     x29, x30, [sp,#-32]!
  400598:       910003fd        mov     x29, sp
  40059c:       90000000        adrp    x0, 400000 <_init-0x408>
  4005a0:       911ba000        add     x0, x0, #0x6e8
  4005a4:       f9000fa0        str     x0, [x29,#24]
  4005a8:       f9400fa0        ldr     x0, [x29,#24]
  4005ac:       97ffffb1        bl      400470 <puts@plt>
  4005b0:       90000000        adrp    x0, 400000 <_init-0x408>
  4005b4:       911bc000        add     x0, x0, #0x6f0
  4005b8:       f9400fa1        ldr     x1, [x29,#24]
  4005bc:       97ffffb1        bl      400480 <printf@plt>
  4005c0:       90000000        adrp    x0, 400000 <_init-0x408>
  4005c4:       911be000        add     x0, x0, #0x6f8
  4005c8:       f9000fa0        str     x0, [x29,#24]
  4005cc:       f9400fa0        ldr     x0, [x29,#24]
  4005d0:       97ffffa8        bl      400470 <puts@plt>
  4005d4:       90000000        adrp    x0, 400000 <_init-0x408>
  4005d8:       911bc000        add     x0, x0, #0x6f0
  4005dc:       f9400fa1        ldr     x1, [x29,#24]
  4005e0:       97ffffa8        bl      400480 <printf@plt>
  4005e4:       90000000        adrp    x0, 400000 <_init-0x408>
  4005e8:       911c0000        add     x0, x0, #0x700
  4005ec:       f9000fa0        str     x0, [x29,#24]
  4005f0:       f9400fa0        ldr     x0, [x29,#24]
  4005f4:       97ffff9f        bl      400470 <puts@plt>
  4005f8:       90000000        adrp    x0, 400000 <_init-0x408>
  4005fc:       911bc000        add     x0, x0, #0x6f0
  400600:       f9400fa1        ldr     x1, [x29,#24]
  400604:       97ffff9f        bl      400480 <printf@plt>
  400608:       90000000        adrp    x0, 400000 <_init-0x408>
  40060c:       911c2000        add     x0, x0, #0x708
  400610:       f9000fa0        str     x0, [x29,#24]
  400614:       f9400fa0        ldr     x0, [x29,#24]
  400618:       97ffff96        bl      400470 <puts@plt>
  40061c:       90000000        adrp    x0, 400000 <_init-0x408>
  400620:       911bc000        add     x0, x0, #0x6f0
  400624:       f9400fa1        ldr     x1, [x29,#24]
  400628:       97ffff96        bl      400480 <printf@plt>
  40062c:       52800000        mov     w0, #0x0                        // #0
  400630:       a8c27bfd        ldp     x29, x30, [sp],#32
  400634:       d65f03c0        ret

0000000000400638 <__libc_csu_init>:
  400638:       a9bc7bfd        stp     x29, x30, [sp,#-64]!
  40063c:       910003fd        mov     x29, sp
  400640:       a901d7f4        stp     x20, x21, [sp,#24]
  400644:       f00000f4        adrp    x20, 41f000 <__FRAME_END__+0x1e8f4>
  400648:       f00000f5        adrp    x21, 41f000 <__FRAME_END__+0x1e8f4>
  40064c:       91380294        add     x20, x20, #0xe00
  400650:       9137e2b5        add     x21, x21, #0xdf8
  400654:       a902dff6        stp     x22, x23, [sp,#40]
  400658:       cb150294        sub     x20, x20, x21
  40065c:       f9001ff8        str     x24, [sp,#56]
  400660:       9343fe94        asr     x20, x20, #3
  400664:       2a0003f6        mov     w22, w0
  400668:       aa0103f7        mov     x23, x1
  40066c:       aa0203f8        mov     x24, x2
  400670:       97ffff66        bl      400408 <_init>
  400674:       b4000194        cbz     x20, 4006a4 <__libc_csu_init+0x6c>
  400678:       f9000bb3        str     x19, [x29,#16]
  40067c:       d2800013        mov     x19, #0x0                       // #0
  400680:       f8737aa3        ldr     x3, [x21,x19,lsl #3]
  400684:       aa1803e2        mov     x2, x24
  400688:       aa1703e1        mov     x1, x23
  40068c:       2a1603e0        mov     w0, w22
  400690:       91000673        add     x19, x19, #0x1
  400694:       d63f0060        blr     x3
  400698:       eb13029f        cmp     x20, x19
  40069c:       54ffff21        b.ne    400680 <__libc_csu_init+0x48>
  4006a0:       f9400bb3        ldr     x19, [x29,#16]
  4006a4:       a941d7f4        ldp     x20, x21, [sp,#24]
  4006a8:       a942dff6        ldp     x22, x23, [sp,#40]
  4006ac:       f9401ff8        ldr     x24, [sp,#56]
  4006b0:       a8c47bfd        ldp     x29, x30, [sp],#64
  4006b4:       d65f03c0        ret

00000000004006b8 <__libc_csu_fini>:
  4006b8:       d65f03c0        ret

Disassembly of section .fini:

00000000004006bc <_fini>:
  4006bc:       a9bf7bfd        stp     x29, x30, [sp,#-16]!
  4006c0:       910003fd        mov     x29, sp
  4006c4:       a8c17bfd        ldp     x29, x30, [sp],#16
  4006c8:       d65f03c0        ret
[root@localhost#/出
1.
0x4006e8
2.
0x4006f8
3.
0x400700
4.
0x400708
[root@localhostzz]#objdump-d a.out
a、 输出:文件格式elf64-LITLEARCH64
分解.init节:
0000000000400408 :
400408:a9bf7bfd stp x29,x30,[sp,#-16]!
40040c:910003fd mov x29,sp
400410:94000032 bl 4004d8
400414:a8c17bfd ldp x29,x30,[sp],#16
400418:d65f03c0 ret
节段plt的拆卸:
0000000000400420 :
400420:a9bf7bf0 stp x16,x30,[sp,#-16]!
400424:f00000f0 adrp X1641F000
400428:f947fe11 ldr x17[x16,#4088]
40042c:913fe210添加x16、x16、#0xff8
400430:d61f0220 br x17
400434:d503201f nop
400438:d503201f nop
40043c:d503201f nop
0000000000400440 :
400440:9000010 adrp X16420000
400444:f9400211 ldr x17[x16]
400448:91000210添加x16、x16、#0x0
40044c:d61f0220 br x17
0000000000400450 :
400450:9000010 adrp X16420000
400454:f9400611 ldr x17[x16,#8]
400458:91002210添加x16、x16、#0x8
40045c:d61f0220 br x17
0000000000400460 :
400460:9000010 adrp X16420000
400464:f9400a11 ldr x17,[x16,#16]
400468:91004210添加x16、x16、#0x10
40046c:d61f0220 br x17
0000000000400470 :
400470:9000010 adrp X16420000
400474:f9400e11 ldr x17,[x16,#24]
400478:91006210添加x16、x16、#0x18
40047c:d61f0220 br x17
0000000000400480 :
400480:9000010 adrp X16420000
400484:f9401211 ldr x17[x16,#32]
400488:91008210添加x16、x16、#0x20
40048c:d61f0220 br x17
第节的分解。正文:
0000000000400490 :
400490:d280001d mov x29,#0x0/#0
400494:d280001e mov x30,#0x0/#0
400498:910003fd mov x29,sp
40049c:aa0003e5 mov x5,x0
4004a0:f94003e1 ldr x1[sp]
4004a4:910023e2添加x2,sp,#0x8
4004a8:910003e6 mov x6,sp
4004ac:580000a0 ldr x0,4004c0
4004b0:580000c3 ldr x3,4004c8
4004b4:580000e4 ldr X44004D0
4004b8:97FFFF2 bl 400440
公元前4004bc:97FFFF9 bl 400460
4004c0:00400594.字0x00400594
4004c4:00000000。字0x00000000
4004c8:00400638.字0x00400638
4004cc:00000000。字0x00000000
4004d0:004006b8.字0x004006b8
4004d4:00000000。字0x00000000
0000000000 4004D8:
4004d8:f00000e0 adrp x0,41f000
4004dc:f947f000 ldr x0,[x0,#4064]
4004e0:b4000040 cbz x0,4004e8
4004e4:17ffffdb b 400450
4004e8:d65f03c0 ret
4004ec:00000000。指令0x00000000;未定义
0000000000 4004F0:
4004f0:90000100 adrp X420000
4004f4:9100e000加上x0,x0,#0x38
4004f8:90000101 adrp x1,420000
4004fc:9100e021添加x1,x1,#0x38
400500:eb00003f cmp x1,x0
400504:540000a0 b.eq 400518
400508:90000001 adrp x1,400000
40050c:f9436c21 ldr x1[x1,#1752]
400510:b4000041 cbz x1,400518
400514:d61f0020 br x1
400518:d65f03c0 ret
40051c:d503201f编号
0000000000400520 :
400520:90000100 adrp X420000
400524:9100e000加上x0,x0,#0x38
400528:90000101 adrp x1,420000
40052c:9100e021添加x1,x1,#0x38
400530:cb000021子x1、x1、x0
400534:9343fc21 asr x1,x1,#3
400538:8b41fc21添加x1、x1、x1、lsr#63
40053c:9341fc21 asr x1,