字符串
在C语言中,字符串是由字符组成,单字符不是字符串,至少有两个字符组成,且结尾字符是’/0’。
例如:”ABCD” 内存中实际储存结构是 41H 42H 43H 44H 00H
字符串的寻址,依靠首字节进行寄存器相对寻址方式:
例如:访问”ABCD”中的第二字节,byte ptr [ebx+1]
正是因为字符串的首字节索引的寻址方式,因此字符串往往要与指针配合。在C语言中常见的,
例如:char *str=“ABCD”;//mov [xxxx],offset string “ABCD”
另一种常见的方式,是将字符串放在数组里,需要首字节地址时,在数组名前加”&”伪装成指针。当然,存在数组里的字符串,自然可以按照数组的访问方式,比如 直接寻址。
数组
数组其实和普通变量没什么区别,每一个成员都是分别通过直接寻址方式访问。
但只有一种情况例外,并且十分常见,即当索引号为变量时,使用相对寻址方式。
例如:
1 | char a[4]={'A','A','A','/0'}; |
对应反汇编:
1 | char a[4]={'A','A','A','/0'}; |
数组的尴尬
除了源码调试,由于数组不标记边界,提通过数据初始化不能判断数组的始末位置
比如:
1 | int i=0; |
显然,只看初始化我们很容易错误还原为 int a[4]={0,1,2,3};
因此数组的边界判断,需要后续代码流程的辅助,因为数组通常都是同一类操作的集合。