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
在这里插入图片描述

发布了203 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41683305/article/details/105128229