C语言中sizeof和strlen有何神通,一量字节一数字符,究竟有何区别?

2026-04-12 08:301阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计926个文字,预计阅读时间需要4分钟。

C语言中sizeof和strlen有何神通,一量字节一数字符,究竟有何区别?

1. 题目:目录+1、sizeof与strlen+2、short a[100]、sizeof(a)返回什么? 简答:sizeof(a)返回100。

2. 题目:下列程序在32位linux或unix中的结果是? 简答:具体结果取决于程序内容。

3. 题目:sizeof与strlen的区别本质上是什么?先上一个例子: 简答:sizeof返回变量所占的字节数,而strlen返回字符串的长度,不包括结束符'\0'。

4. 题目:sizeof char[]=? 简答:sizeof char[]=1。

目录
  • 1、sizeof与strlen
  • 2、short a[100],sizeof(a)返回?
  • 3、下列程序在32位 linux 或 unix 中的结果是什么?
  • 4、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:段错误

C语言中sizeof和strlen有何神通,一量字节一数字符,究竟有何区别?

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 89

为什么在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类型的值。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。

本文共计926个文字,预计阅读时间需要4分钟。

C语言中sizeof和strlen有何神通,一量字节一数字符,究竟有何区别?

1. 题目:目录+1、sizeof与strlen+2、short a[100]、sizeof(a)返回什么? 简答:sizeof(a)返回100。

2. 题目:下列程序在32位linux或unix中的结果是? 简答:具体结果取决于程序内容。

3. 题目:sizeof与strlen的区别本质上是什么?先上一个例子: 简答:sizeof返回变量所占的字节数,而strlen返回字符串的长度,不包括结束符'\0'。

4. 题目:sizeof char[]=? 简答:sizeof char[]=1。

目录
  • 1、sizeof与strlen
  • 2、short a[100],sizeof(a)返回?
  • 3、下列程序在32位 linux 或 unix 中的结果是什么?
  • 4、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:段错误

C语言中sizeof和strlen有何神通,一量字节一数字符,究竟有何区别?

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 89

为什么在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类型的值。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。