/*
2016年6月6日12:40:22 关于sizeof 和 strlen 的用法
*/
#include<stdio.h>
#include<string.h>
void sizeofApp(char * a)
{
printf("%d %d %d\n",sizeof(a),sizeof(*a),strlen(a));
}
int main(void)
{
char str1[] = "1";
char str2[] = "11";
printf("sizeof(str1) = %d\n",sizeof(str1));
printf("sizeof(str2) = %d\n",sizeof(str2));
printf("strlen(str1) = %d\n",strlen(str1));
printf("strlen(str2) = %d\n",strlen(str2));
sizeofApp(str1);
sizeofApp(str2);
return 0;
}
/*
在VC++中的结果是:
sizeof(str1) = 2
sizeof(str2) = 3
strlen(str1) = 1
strlen(str2) = 2
4 1 1
4 1 2
Press any key to continue
分析:为什么会出现这样的结果,sizeof 在不不同的函数里对同一个数组进行处理,结果不一样
①首先来看看sizeof的作用,sizeof作用就是返回一个对象或者类型所占的字节数
先来看一看第一个 4 是怎样来的 ,首先 char str1[] = "1" 语句申请了两个字节的内存空间(一个字节保存 '\0')
然后将str1数组的首地址传给sizeofApp的形参,记住, 这时候接收的是str1的首地址,这时候形参a的值就变成了str1的首地址, 然后sizeof(a)这个
语句的功能是计算 a (也就是存str1首地址的指针变量)的所占内存字节大小,在32位机下,指针变量所占内存大小都是4个字节,所以说值为4,同
样的道理,第二个4也一样
②然后我们看第一个4后面的1是怎么来的,我们前面说了,sizeofApp(str1)是把str1的首地址传给了sizeofApp,那么 a 就指向了str1 数组的第一个元素
* a 就代表了第一个元素, 所以说 sizeof(*a) 的意思就是说 计算 a[0] 即 str1[0] 所占的内存 显然 这个数组中的一个元素所占内存为 1个字节
所以值为1(注意:这时候 sizeof(*a) 不是计算整个数组所占内存大小)
③在来看第一个4后面的第二个1,首先我们看一下strlen的含义,strlen是计算机C语言的函数,作用是计算字符串s的长度(也就是说有几个元素),不包
括'\0'在内,它从内存的某个位置开始扫描,知道碰到第一个字符串结束符'\0',为止,然后返回计数值这个例子中,主函数中使用strlen(str1),其过程
就是碰到 字符 1 计 1 碰到字符 \0 停止 返回 1 ;而在被调函数中, a 指向了 str1 的第一个元素,然后 访问 第一个元素 1 计 1 访问第二个元素
停止,返回1 和在主函数是一样的
其他的可以自行分析
*/
2016年6月6日12:40:22 关于sizeof 和 strlen 的用法
*/
#include<stdio.h>
#include<string.h>
void sizeofApp(char * a)
{
printf("%d %d %d\n",sizeof(a),sizeof(*a),strlen(a));
}
int main(void)
{
char str1[] = "1";
char str2[] = "11";
printf("sizeof(str1) = %d\n",sizeof(str1));
printf("sizeof(str2) = %d\n",sizeof(str2));
printf("strlen(str1) = %d\n",strlen(str1));
printf("strlen(str2) = %d\n",strlen(str2));
sizeofApp(str1);
sizeofApp(str2);
return 0;
}
/*
在VC++中的结果是:
sizeof(str1) = 2
sizeof(str2) = 3
strlen(str1) = 1
strlen(str2) = 2
4 1 1
4 1 2
Press any key to continue
分析:为什么会出现这样的结果,sizeof 在不不同的函数里对同一个数组进行处理,结果不一样
①首先来看看sizeof的作用,sizeof作用就是返回一个对象或者类型所占的字节数
先来看一看第一个 4 是怎样来的 ,首先 char str1[] = "1" 语句申请了两个字节的内存空间(一个字节保存 '\0')
然后将str1数组的首地址传给sizeofApp的形参,记住, 这时候接收的是str1的首地址,这时候形参a的值就变成了str1的首地址, 然后sizeof(a)这个
语句的功能是计算 a (也就是存str1首地址的指针变量)的所占内存字节大小,在32位机下,指针变量所占内存大小都是4个字节,所以说值为4,同
样的道理,第二个4也一样
②然后我们看第一个4后面的1是怎么来的,我们前面说了,sizeofApp(str1)是把str1的首地址传给了sizeofApp,那么 a 就指向了str1 数组的第一个元素
* a 就代表了第一个元素, 所以说 sizeof(*a) 的意思就是说 计算 a[0] 即 str1[0] 所占的内存 显然 这个数组中的一个元素所占内存为 1个字节
所以值为1(注意:这时候 sizeof(*a) 不是计算整个数组所占内存大小)
③在来看第一个4后面的第二个1,首先我们看一下strlen的含义,strlen是计算机C语言的函数,作用是计算字符串s的长度(也就是说有几个元素),不包
括'\0'在内,它从内存的某个位置开始扫描,知道碰到第一个字符串结束符'\0',为止,然后返回计数值这个例子中,主函数中使用strlen(str1),其过程
就是碰到 字符 1 计 1 碰到字符 \0 停止 返回 1 ;而在被调函数中, a 指向了 str1 的第一个元素,然后 访问 第一个元素 1 计 1 访问第二个元素
停止,返回1 和在主函数是一样的
其他的可以自行分析
*/