C语言之sizeof与strlen的使用及区别

 更新时间:2022年07月13日 10:45:54   作者:魏波-  
这篇文章主要介绍了C语言之sizeof与strlen的使用及区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

先上一个例子:

结果: 

1、sizeof与strlen

char c[] = “abc\0cba”;

问题1:sizeof(c) = ?

问题2:strlen(c) = ?

问题3:执行free(c);之后会有什么后果?

解答1:8

解答2:3   (判断字符串a的长度,这个长度不包括"\0")

解答3:段错误

2、short a[100],sizeof(a)返回? 

A 2     B 4       C 100       D 200        E 400 

答案:D

段错误:指访问的内存超出了系统所给这个程序的内存空间。

汇编语言的程序设计是分4个段来设计的,即用来放数据的数据段DS,临时存放数据的堆栈段SS、存放程序代码的代码段、存放附加数据的附加段,每一段的最大存储空间为64KB,跳转指令、程序调用指令在转移到地址没有超过64KB地址空间范围的叫段内转移,超出64KB地址空间范围的叫段间转移。这就是段内和段间的含义。 

3、下列程序在32位 linux 或 unix 中的结果是什么?

void func(char *str)
{
	printf(" %d", sizeof(str));
	printf(" %d", strlen(str));
}
 
int main() 
{
	char a[] = "123456789";
	printf(" %d", sizeof(a));
	printf(" %d", strlen(a));
	func(a);
 
	getchar();
	return 0;
}

结果: 10 9 4 9

在C/C++里数组作为参数时传递的实际上是指向数组第一个元素的指针,因此sizeof(str)返回的是指针的大小,即4。所有的指针大小都是4。

下列程序在 64 位 linux 或 unix 中的结果是什么?

结果: 10 9 8 9

为什么在64位系统中指针的大小是8,而32位的却是4? 

64位系统,这个位数指的是CPU 里面的通用寄存器的数据宽度为64位,也就是说一个地址占二进制位数是64,所以sizeof(double *)==sizeof(int *)==sizeof(char *)==64/8==8

32位系统,同理,他的一个地址占32位二进制空间,sizeof(double *)==sizeof(int *)==sizeof(char *)==32/8==4

其实明白了两个系统的寻址原理就能明白,大体就是这个原因。地址跟系统有关,但是基本数据类型占的大小是由C语言本身决定。 

4、sizeof与strlen的区别本质上而言

不同点:

(1)sizeof是一个运算符,它用类型作为参数,而strlen只是C库提供的一个函数,他用来计算以’/0’结果的字符串的长度,即它的参数只能是char*。

(2)strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,而sizeof的结果是在编译的时候就计算过的,是类型或变量占内存的大小。 注意:sizeof计算的是类型或者变量占内存的大小。

相同点:

(1)它们相同的地点就只是返回值,都是一个size_t类型的值。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++中const的常见用法详解

    C++中const的常见用法详解

    const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的,本文为大家整理了const的几种使用,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-06-06
  • C++ 类中有虚函数(虚函数表)时 内存分布详解

    C++ 类中有虚函数(虚函数表)时 内存分布详解

    下面小编就为大家带来一篇C++ 类中有虚函数(虚函数表)时 内存分布详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++基于socket编程实现聊天室功能

    C++基于socket编程实现聊天室功能

    这篇文章主要介绍了C++基于socket编程实现聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 详解C语言整数和浮点数在内存中的存储

    详解C语言整数和浮点数在内存中的存储

    这篇文章主要介绍了C语言整数和浮点数在内存中是如何存储的,文中有详细的代码示例供大家参考,对大家了解学习C语言整数和浮点数在内存中的存储有一定的帮助,需要的朋友可以参考下
    2024-03-03
  • 浅谈C++中派生类对象的内存布局

    浅谈C++中派生类对象的内存布局

    下面小编就为大家带来一篇浅谈C++中派生类对象的内存布局。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++分析类的对象作类成员调用构造与析构函数及静态成员

    C++分析类的对象作类成员调用构造与析构函数及静态成员

    终于到了对象的初始化和清理的最后阶段了,在这里分享一个cpp里有多个类时,一个类的对象作为另一个类成员的时候构造函数和析构函数调用的时机。还有一个静态成员也是经常考到的点,在这篇博客将会详解其概念并举出案例巩固,让我们开始
    2022-05-05
  • wchar_t,char,string,wstring之间的相互转换

    wchar_t,char,string,wstring之间的相互转换

    以下是对wchar_t,char,string,wstring之间的相互转换进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-09-09
  • C++ 智能指针的模拟实现实例

    C++ 智能指针的模拟实现实例

    这篇文章主要介绍了C++ 智能指针的模拟实现实例的相关资料,智能指针是一个类,它把普通指针封装起来,能实现和普通指针同样的功能。,需要的朋友可以参考下
    2017-07-07
  • C++实现的归并排序算法详解

    C++实现的归并排序算法详解

    这篇文章主要介绍了C++实现的归并排序算法,结合实例形式详细分析了归并排序算法的原理、实现步骤、操作技巧与使用方法,需要的朋友可以参考下
    2017-05-05
  • 缓存处理函数storageKeySuffix操作示例解析

    缓存处理函数storageKeySuffix操作示例解析

    这篇文章主要介绍了浅析缓存处理函数storageKeySuffix操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论