我在看char* c = "thomas";
和char c[] = "thomas";
之间的C差异。我在这里看到了一些关于这个问题的问题,同时试图理解我想通过查看程序集来检查我是否正确的答案。并且有几个问题诞生了。解释编译代码结构和静态分配
下面是我想:
char* c = ...
:字符的静态存储器分配的地方(只从程序的角度看),旁边的代码。这就是为什么它应该被标记为const
。字符串可以打印但不能修改。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 <[email protected]>
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>
所以字符被复制到堆栈中,这就是我的想法。
问题:
的字符的字节位于地址
0x6978616d, 0x6220656d
存储等。为什么不在数组中连续分配?编译器的简单优化?-
- 解释了为什么
char*
没有表现得像一个数组,为什么c[10]
不是字符串的字符11。 然而它没有解释为什么
的char * C = “托马斯blabljbflkjbsdflkjbds”; printf(“%s \ n”,c);
- 解释了为什么
工程。 (请注意[] - > *)。我猜printf
字符按字符读取,直到达到0,所以只知道c (i.e &c[0])
如何访问c[10]
? (因为不连续,并且事实上这次的字符没有被拷贝到栈上的数组)。
我希望我很清楚,如果你问/不明白某个观点,我可以重新阐述。谢谢
我将增加对2串实际上表示为静态数组附近的代码,我看到它时,我看拆装'焦某处* c =“lksdlkfjsd”; printf(“%s \ n”,c);'。所以它不是好像阵列是分散的,第二个问题不需要。 – Thomas