用sizeof计算数组的长度有什么要注意的地方

用sizeof计算数组的长度有什么要注意的地方,第1张

通过sizeof可以计算出类型的长度,同样也可以计算出数组的长度,但是这具有一定的局限性。

以下是一段示例代码:

session 1: 计算出数组的长度

session 2: 通过函数计算出数组的长度

session 3: 通过函数计算出数组的长度

sizeof是求类型的大小,不管是表达式还是后面直接加类型;换种说法是在其后表达式在内存中占用的字节。

p是char 类型,当然是4字节。

改为char p[] = "hello";

这就是后面字符串的长度。

sizeof(p);求得是指针p的大小,不管你上面是任何类型,任何字符串,都是4,因为指针的空间大小就是4;

char p="hello";//改成char p[]="hello";

cout<<sizeof(p);//结果是6,字符串后面还有个'\0'字符

cout<<strlen(p); //结果是5,忽略此字符

字符串在存储上类似字符数组

它每一位单个元素都是能提取的,字符串的零位是它的长度,如s[0]=10,这提供给我们很多方便,例如高精度运算时每一位都能转化为数字存入数组。

通常以串的整体作为 *** 作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。

设p、q是两个串,求q在p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和链接存储方式。

百度百科-字符串

#include <stdioh>
#include <stringh>
int main()
{
    int i;
    char s[]="1234"; //两种方法,一是直接调用函数strlen,一是直接计算,计算值会多1
     //因为多了个数组结尾符'\0\'
    printf("长度是:%d %d\n",strlen(s),sizeof(s)/sizeof(char)); //结果是4,5
    for(i=0;i<strlen(s);i++)//遍历访问数组时,用strlen(s)作为长度限定输出即可
         printf("%c",s[i]);
        printf("\n");
    return 0;  
}

这个问题,怎么说呢。
如果使用数组,在定义时必需知道数组长度。
如果动态分配,在分配时必需给定一个长度(这个值可以是在程序执行时获取到的),然后才能分配内存。
你上面的问题,其实是动态分配,而不是数组。动态分配的内存,系统会记录相关数据,如果你使用自己的内存管理函数,可以很方便的取到长度,但是如果你使用其他函数(标准库的或者别人的),你就只能自己记录长度值(如果必要,可以记录两个:最大长度、有效长度)。

当然,你可以想办法获取该段内存的总长度。但是这时候,指针本身会占用内存,而且分配的内存空间可能未做过初始化或者会溢出,不能准确获取长度。其实,内存本身就是你自己分配的,你就应该知道它的长度,一般不必费力去根据指针获取对应的内存长度。

你说的情况,即使你不知道int1、int2、int3,程序执行时也肯定是知道的,你直接
cout<<int1+int2+int3<<endl;

//该函数为求字符串长度的函数,规定字符串结尾为0x0,即NULL
//而你是求整形数组的长度,这个你用sizeof(La)/sizeof(List)即可求出来,
//注意:因为sizeof是编译器预处理,编译器不同可能会造成求出的结果为指针长度和数组长度两种情况,vc下是数组长度
int Listlength(List L){
int count=0;
List p=L;
while (p!=NULL)
{count++;
p++;}
return count;
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12605868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存