C和彙編---sizeof運算符和strlen函數

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
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章