gpt4 book ai didi

c - 解释编译代码结构和静态分配

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:14 25 4
gpt4 key购买 nike

我正在研究 char* c = "thomas";char c[] = "thomas"; 在 C 语言中的区别。我在这里看到了关于这个的问题,在试图理解答案时,我想通过查看程序集来检查我是否正确。一些问题诞生了。

这是我的想法:

  1. char* c = ... :字符与代码一起分配在静态内存中的某处(从程序的角度只读)。这就是为什么它应该被标记为const。字符串可以打印但不能修改。

  2. char c[] = ... : 和1一样。只是调用函数时,字符被复制到栈上的数组中,所以可以修改等等等等

我想检查一下,所以我编写了这个 C 代码:

#include <stdio.h>

int main(){
char c [] = "thomas blabljbflkjbsdflkjbds";
printf("%s\n", c);
}

查看生成的程序集:

   0x400564 <main>:    push   rbp
0x400565 <main+1>: mov rbp,rsp
0x400568 <main+4>: sub rsp,0x30
0x40056c <main+8>: mov rax,QWORD PTR fs:0x28
0x400575 <main+17>: mov QWORD PTR [rbp-0x8],rax
0x400579 <main+21>: xor eax,eax
0x40057b <main+23>: mov DWORD PTR [rbp-0x30],0x6978616d
0x400582 <main+30>: mov DWORD PTR [rbp-0x2c],0x6220656d
0x400589 <main+37>: mov DWORD PTR [rbp-0x28],0x6c62616c
0x400590 <main+44>: mov DWORD PTR [rbp-0x24],0x6c66626a
0x400597 <main+51>: mov DWORD PTR [rbp-0x20],0x73626a6b
0x40059e <main+58>: mov DWORD PTR [rbp-0x1c],0x6b6c6664
0x4005a5 <main+65>: mov DWORD PTR [rbp-0x18],0x7364626a
0x4005ac <main+72>: mov BYTE PTR [rbp-0x14],0x0
0x4005b0 <main+76>: lea rax,[rbp-0x30]
0x4005b4 <main+80>: mov rdi,rax
0x4005b7 <main+83>: call 0x400450 <puts@plt>
0x4005bc <main+88>: mov rdx,QWORD PTR [rbp-0x8]
0x4005c0 <main+92>: xor rdx,QWORD PTR fs:0x28
0x4005c9 <main+101>: je 0x4005d0 <main+108>

所以字符被复制到栈中,我也是这么想的。

问题:

  1. 字符按字节存储在地址0x6978616d、0x6220656d等。为什么它们不在数组中连续分配?编译器的简单优化 ?

    1. 解释了为什么 char* 的行为不像数组,以及为什么 c[10] 不是字符串的第 11 个字符。 但是它没有解释为什么

    char* c = "托马斯 blabljbflkjbsdflkjbds";printf("%s\n", c);

有效。 (注意 [] -> *)。我想 printf 会逐个字符读取字符,直到达到 0,所以只知道 c (i.e &c[0]) 它如何访问 c[10] ? (因为不连续,而且这次 chars 没有被复制到栈上的数组中)

我希望我很清楚,如果你问/不明白某个点,我可以重新表述。谢谢

最佳答案

1: 0x6978616d, 0x6220656d 不是地址,是你字符串中的数据。当从十六进制转换为 ascii 时,0x6978616d = moht0x6220656d = b sa

2:当在函数调用中使用时,数组会退化为指针。因此,无论 c 是数组还是指针,printf 都会收到一个指向 char 的指针。

关于c - 解释编译代码结构和静态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20633054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com