sizeof
sizeof是C語言的內置運算符,以字節爲單位給出指定類型的大小。
程序:
#include <stdio.h>
int main(void)
{
int a=8;
int b = sizeof(a);
//printf("a佔用字節=%u\n",sizeof(a));
printf("a佔用字節=%d\n",b);
return 0;
}
反彙編:
5: int a=8;
00401028 C7 45 FC 08 00 00 00 mov dword ptr [ebp-4],8
6: int b = sizeof(a);
0040102F C7 45 F8 04 00 00 00 mov dword ptr [ebp-8],4
7: //printf("a佔用字節=%u\n",sizeof(a));
8: printf("a佔用字節=%d\n",b);
00401036 8B 45 F8 mov eax,dword ptr [ebp-8]
00401039 50 push eax
0040103A 68 1C 20 42 00 push offset string "a\xd5\xbc\xd3\xc3\xd7\xd6\xbd\xda=%d\n" (0042201c)
0040103F E8 2C 00 00 00 call printf (00401070)
00401044 83 C4 08 add esp,8
我們看int b = sizeof(a);
的反彙編:
0040102F C7 45 F8 04 00 00 00 mov dword ptr [ebp-8],4
直接就將4傳過來了,所以sizeof不是一個函數,只是一個運算符,是計算一個變量所佔用內存的字節數
strlen函數
strlen()函數給出字符串中的字符長度。使用strlen函數,必須包含string.h庫
程序:
#include <stdio.h>
#include <string.h> /* 提供strlen()函數的原型 */
int main(void)
{
char str[40]="hello d1l1endh";
int len=strlen(str);
printf("len=%d\n",len);
return 0;
}
hello d1l1endh的長度是14,注意strlen計算的不是str數組所佔用的空間的大小(不是40)
反彙編看一下:
6: int len=strlen(str);
0040D752 8D 55 D8 lea edx,[ebp-28h]
0040D755 52 push edx
0040D756 E8 85 8F FF FF call strlen (004066e0)
0040D75B 83 C4 04 add esp,4
0040D75E 89 45 D4 mov dword ptr [ebp-2Ch],eax
7: printf("len=%d\n",len);
0040D761 8B 45 D4 mov eax,dword ptr [ebp-2Ch]
0040D764 50 push eax
0040D765 68 1C 20 42 00 push offset string "a\xd5\xbc\xd3\xc3\xd7\xd6\xbd\xda=%d\n" (0042201c)
0040D76A E8 01 39 FF FF call printf (00401070)
0040D76F 83 C4 08 add esp,8
8: return 0;
0040D772 33 C0 xor eax,eax
9:
10: }
[ebp-28h]`是str的首地址,把str的首地址壓入棧中,然後調用strlen函數
我們知道字符串是以\0爲結尾的,strlen的工作原理是當讀取\0時,將不再計算長度,返回長度。
#include <stdio.h>
#include <string.h> /* 提供strlen()函數的原型 */
int main(void)
{
char str[40]="hello d1l1endh\0abcdesf";
int len=strlen(str);
printf("len=%d\n",len);
return 0;
}
上面的程序在h後面加上了\0,結果依然爲14