字符串是以空字符(\0)结尾的char类型数组。
0x01 定义字符串和初始化
用双引号括起来的内容称为字符串字面量,也叫字符串常量,双引号中的字符串和编译器自动加入\0字符,都作为字符串存储在内存中
#include "stdio.h"
int main()
{
char string[]="hello deng";
return 0;
}
反汇编我们可以看到,hello deng的内容已经在另一个位置,首先给string一个地址,然后将hello deng复制到以string为首地址的内存中
5: char string[]="hello deng";
00401028 A1 1C 20 42 00 mov eax,[string "hello deng" (0042201c)]
0040102D 89 45 F4 mov dword ptr [ebp-0Ch],eax
00401030 8B 0D 20 20 42 00 mov ecx,dword ptr [string "hello deng"+4 (00422020)]
00401036 89 4D F8 mov dword ptr [ebp-8],ecx
00401039 66 8B 15 24 20 42 00 mov dx,word ptr [string "hello deng"+8 (00422024)]
00401040 66 89 55 FC mov word ptr [ebp-4],dx
00401044 A0 26 20 42 00 mov al,[string "hello deng"+0Ah (00422026)]
00401049 88 45 FE mov byte ptr [ebp-2],al
6: return 0;
0040104C 33 C0 xor eax,eax
从下图可以看出,字符串在内存中的确以\00结尾,并且字符在内存存储的是字符的ASCII值,所以在指定数组大小时,要确保数组的元素个数至少比字符串长度多1,所有未被使用的元素都被自动化初始化为\00
0x02 指针和字符串
字符串是以空字符(\0)结尾的char类型数组。分析和另一篇数组博客说的一样。