首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当参数是指向数组的解引用指针时,为什么``sizeof()‘不能像预期的那样工作?

当参数是指向数组的解引用指针时,sizeof()不能像预期的那样工作的原因是,指针在传递给函数时会丢失数组的大小信息。sizeof()运算符在编译时计算对象或类型的大小,但对于指针而言,它只返回指针本身的大小,而不是指向的数组的大小。

解决这个问题的一种常见方法是,在函数中额外传递数组的大小作为参数。这样可以确保在函数内部正确地使用数组的大小信息。

另一种方法是使用C++中的模板来处理数组的大小。通过模板参数推导,可以在编译时获取数组的大小信息,并在函数中使用。

以下是一个示例代码,展示了如何在函数中正确处理指向数组的解引用指针的大小:

代码语言:txt
复制
#include <iostream>

template <typename T, size_t N>
void processArray(T(&arr)[N]) {
    size_t size = sizeof(arr) / sizeof(arr[0]);
    std::cout << "Array size: " << size << std::endl;

    // 其他处理数组的代码...
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    processArray(arr);

    return 0;
}

在上述示例中,我们使用了模板函数processArray()来处理指向数组的解引用指针。通过模板参数推导,编译器可以推导出数组的大小N,并在函数中使用sizeof(arr) / sizeof(arr[0])来计算数组的大小。

请注意,以上示例中没有提及任何特定的云计算品牌商或产品。如果需要了解腾讯云相关产品和产品介绍,建议访问腾讯云官方网站或咨询腾讯云的客服人员。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

抽丝剥茧C语言(高阶)动态内存管理+练习

如果参数 ptr 指向空间不是动态开辟,那free函数行为未定义。 如果参数 ptr NULL指针,则函数什么事都不做。...所以一定开辟失败,返回指针,下面引用指针然后还要赋值,肯定是非法。...,这就是为什么要让他指向指针。...正确方法用二级指针储存str(GetMemory函数参数要用二级指针),然后引用这个二级指针就能找到str位置了,然后让str记住开辟内存位置。...sizeof 返回这种结构大小不包括柔性数组内存。 包含柔性数组成员结构用malloc ()函数进行内存动态分配,并且分配内存应该大于结构大小,以适应柔性数组预期大小。

34801

C语言灵魂——指针

解释: main()主调函数,Increment()被调函数,当我们在主调函数中调用其他函数,这个参数叫做实参,这个被调函数参数叫做形参,实参会被映射到形参,这个函数被调用时候,主函数中实参...,数组名字作为指针时候,不能对它进行自增操作,会报错。...二维数组数组B被当成指针时候,他里面存B [0] [0]地址,再对他进行引用得到对应值,1。...不同点: B返回一个指向一个一维数组指针,而*B返回一个指向整型指针,当我们只是打印地址时候,一维数组B[0]和B[0]首元素起始地址一样,所以打印地址相同指针类型会在你尝试引用时或者尝试做指针算术时候起作用...栈,先进后出,先进被压倒栈底, Add函数调用完成,返回一个指向结果指针(地址),然后内存被释放,所指向地址对应值就是个垃圾值,尽管他指向这个地址,但是他不能被保证,因为内存被释放了,

87310

【c++入门】引用,内联函数,auto

不能指针那样先声明一个引用,然后再让它指向一个变量 int x = 5; int &b = x; // 正确,b被初始化为x引用 int &c; // 错误,引用必须在声明时被初始化 引用本质上引用变量别名...一旦引用被初始化为某个变量引用,它就永远引用那个变量,不会指针那样可以改变所指向变量。...通过引用参数,可以直接修改传入变量,而无需担心指针引用和地址操作,这使得代码更加安全、清晰 但是由于引用定义后不能改变指向引用不能替代指针 当然,这里swap函数取名字也可以取x,y,因为他们在不同作用域...关键点在于没有产生任何拷贝,函数直接在原对象上工作 在本例中,TestFunc2被调用,并且以A&(结构体A引用)作为参数,它实际上直接操作原有的对象a,而不是创建一个新拷贝。...,指针可以不初始化 引用不能改变指向指针可以 引用相对更安全,没有空引用,但是有空指针sizeof中含义不同:引用结果为引用类型大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)

8610

指针

不同指针类型决定了指针引用所移动步长 如:char类型,那么它+1就指向下一个字节(向后走一步) int 类型,那么它+1就指向到第4个字节处。...该数组里面有5个元素,i为5,p访问空间超过了数组范围 造成越界访问,这时p就是野指针. 3....,它所指向空间被返还给操作系统 再次对它引用进行访问就造成非法访问。...要改变i值p1要引用2次才可以改变 2. 字符指针 能够指向字符数据指针 形如这样char* p 这里就讲比较难地方吧!...回调函数 回调函数就是一个通过函数指针调用函数。如果你把函数指针(地址)作为参数传递给另一个函数,这个指针被用来调用其所指向函数,我们就说这是回调函数。

28360

c语言内存开辟

动态内存函数 在堆区申请空间,动态开辟空间不要忘了释放 malloc 参数无符号整型,表示是多少字节数。参数为0,这是标准没有定义。取决于编译器。 返回类型为void*指针。...num元素个数,size每个元素大小。 开辟空间成功返回指向该空间指针 开辟空间失败返回空指针NULL。...第一个参数指向动态开辟空间指针,第二个参数为从新开辟内存大小,单位字节。 第一个参数为空指针NULL。和malloc一样。 开辟成功返回,返回从新开辟空间地址。...参数指向动态内存指针首地址。 参数为NULL时候,什么都不发生。...常见动态内存错误 对NULL指针引用操作 这里p万一是空指针,下面这种就是错误 c char* p = (char*)malloc(10 * sizeof(char)); *p = 1;

49320

【C语言】动态内存管理

文章目录 一、为什么存在动态内存分配 二、动态内存开辟函数 1、malloc 2、free 3、calloc 4、realloc 三、常见动态内存错误 1、对NULL指针引用操作 2、对动态开辟空间越界访问...这些函数向内存申请空间有可能会失败,申请失败函数就会返回空指针,如果我们不对函数返回值进行判断,而直接对其引用的话,就会造成程序崩溃;例如: void test() { int* p = (int...,我们可能会在后面的程序中让该指针变量自增,从而让其不再指向该动态空间起始位置,而是指向中间位置或者结尾,这时我们在对其进行free操作,也会导致程序崩溃,因为free函数必须释放一整块动态内存,而不能释放它一部分...,在栈区上开辟空间,而不是在堆区上动态开辟,所以GetMemory函数被调用完毕后其函数栈帧会立即销毁,所以GetMemory函数并不能使str指向一块可用内存; 第二:GetMemory返回了...我们不能指望用户来发现这个事;所以,如果我们第一种代码那样,把结构体内存以及其成员要内存一次性分配好了,并返回给用户一个结构体指针,用户做一次 free 就可以把所有的内存也给释放掉,很大程度上避免了内存泄露

1.6K00

深入探究C语言中常量指针与野指针概念及其应用

常量指针指向常量指针,它不能用来修改所指向数据。这有助于保护数据不被意外修改,提高程序安全性和可维护性。 1. 指向常量指针 当你想阻止通过指针修改数据,可以使用指向常量指针。...未初始化指针:定义指针变量,如果没有进行初始化,那么该指针随机,可能指向任意内存地址。这种情况下,如果尝试通过这个指针去读取或写入数据,可能会导致程序崩溃或其他不可预期行为。 2....指针越界访问:指针超出了它所指向数据结构(如数组边界,就会发生越界访问。例如,一个指向大小为10数组指针,如果尝试访问数组第12个元素,就会造成越界。 3....触发段错误:指针指向一个不可访问内存地址,尝试对其进行引用操作可能会导致段错误,这是因为程序试图访问一个非法内存区域。 2....谨慎引用:在使用指针前,应当确保它指向一个有效内存地址,避免对无效地址进行引用操作。 4.

13910

C语言重点突破(五) 动态内存管理

如果参数 ptr 指向空间不是动态开辟,那free函数行为未定义。 如果参数 ptr NULL指针,则函数什么事都不做。 malloc和free都声明在 stdlib.h 头文件中。...由于上述两种情况,realloc函数使用就要注意一些 3.常见动态内存错误 1 对NULL指针引用操作 对NULL指针引用操作一种未定义行为,可能导致程序崩溃或其他未知行为。...在C/C++中,NULL指针一种特殊指针,其取值为0,在进行指针引用操作,程序会试图访问地址为0内存,这个地址无效,可能会导致程序崩溃。...因此,在进行指针引用操作之前,应该先检查指针是否为NULL,否则可能会出现难以调试错误。...sizeof 返回这种结构大小不包括柔性数组内存。 包含柔性数组成员结构用malloc ()函数进行内存动态分配,并且分配内存应该大于结构大小,以适应柔性数组预期大小。

9610

一篇文章完全讲解C语言指针

当然,我们不能对int类型数据那样进行各种加减乘除操作,这是编译器不允许,因为这样错是非常危险! 图2就是对指针描述,指针数据存放地址,因此,我们说,指针指向数据存放位置。 ?...5、内存数据生命周期 nummain函数中局部变量,因此main函数被启动,它被分配于栈内存上,main执行结束,消亡。...不能对他们做指针操作,否则程序会出现运行时错误,导致程序意外终止。 任何一个指针变量在做地址操作前,都必须保证它指向有效,可用内存块,否则就会出错。...4、p[n] == *(p+n) p[n][m] == *( *(p+n)+ m ) 5、数组名使用sizeof,返回整个数组占用内存字节数。...数组名赋值给一个指针后,再对指针使用sizeof运算符,返回指针大小。 这就是为什么将一个数组传递给一个函数,需要另外用一个参数传递数组元素个数原因了。

84920

【动态内存管理】malloc&calloc和realloc和笔试题和柔性数组

(弄丢)了 //函数原型:void* realloc(void* ptr,size_t size) //ptr:一个指针指针指向扩容空间起始地址 //size:扩容成功后希望得到字节数...4 常见动态内存错误 int main() { //way1:对NULL指针进行引用 int* p = (int*)malloc(INT_MAX + 1); //直接使用//error...,Getmory函数中,"hello world”被放在了一个字符数组里,返回返回数组名,也就是这个数组首元素地址,Getmory函数结束字符数组所占用空间自动销毁,但是返回了栈空间地址,...一旦在test函数内对这地址引用进行访问,那就是非法,未知,上述代码错误原因和下述代码错误类似。...包含柔型数组结构体内存大小不包含柔型数组内存大小。 包含柔性数组结构体在开辟内存得使用malloc函数动态内存开辟,且开辟空间大小必须大于结构体大小,以适应柔型数组预期大小。

48360

【C语言】C语言数组指针

(c/c++会把常量字符串储存到单独一个内存区域中) 这两个指针指向同一个常量字符串,实际上就是指向同一块儿地址**(指针就是地址,地址就是指针)** 2.数组指针 2.1数组指针定义 1.数组指针嘛...”,我们用它本身去接收他自己 所以函数参数一级指针,它能接收什么东西呢???...所以函数参数二级指针,它能接收什么东西呢???...(char*) 上面的数组元素类型就是,int( * )( char * )那这其实就是一个函数指针类型,指向函数返回类型int,参数char* 2.2函数指针数组具体使用场景 int Add...如果你把函数指针(地址)作为参数传递给另一个函数,这个指针被用来调用其所指向函数,我们就说这是回调函数。

64.4K23

【C语言总集篇】指针篇——从不会到会过程

指针指向main函数栈帧中空间,你并不能确定它指向哪一块空间,也就是说,指针p此时可能指向已经被使用地址,那此时对这个空间值进行修改,是不是有可能导致我写代码不能正常运行呢?...; &指针[下标] 当我们对指针使用下标引用操作符,就等价于对指针进行引用,再进行引用后再对其取地址,还能得到指针; *数组名 我们可以通过对数组名进行引用来访问数组各个元素,但是,数组名并不能指针一样进行自增操作...前面我们通过两次引用找到了数组指针指向对象存储数据,这种工作方式与二级指针一样,那是不是说明其实数组指针与二级指针同一个内容不同形式呢?...从函数指针创建信息中我们就可以获得以下信息: 函数指针p1为无返回类型指针,那p1就不能进行引用以及指针+-整数等操作; p1指针指向函数一个无返回类型函数,函数没有参数; p2指针指向函数一个返回类型为...函数指针使用 指针指向函数,此时我们可以认为指针就代表着函数,从而对函数进行直接调用: 对于无返回类型指针来说,我们不能指针进行引用,所以要使用无返回类型指针调用函数,只有这一种方式

24410

程序员C语言快速上手——高级篇(十)

动态内存 内存分配在堆上,用完需手动释放,使用指针引用分配内存,作用域局限于引用内存指针 为什么需要在堆上面分配动态内存?...失败,它不会对原来堆空间造成影响 关于free使用总结使用free函数释放内存后,指向原堆空间指针并不会被清理或重置,这意味着指向原空间指针中仍保存着一个不合法地址,如果不小心再次使用了这个指针...在遇到二级指针,要获取原始变量值,就需要使用两个*进行引用,如上例中**p可获取num值,如使用一个*引用,获得只是指针p地址而已。...short2个字节,char1个字节,int4个字节,而指针保存第一个字节地址,指针声明为short,编译器就知道从当前这个地址往后取几个字节作为一个整体。...如上例,*pInt引用后结果错误,这就是因为原类型short2字节,而使用int*指针引用会超出short本身两字节内存,将紧随其后两字节内存也强制读取了,访问了不合法内存空间,这实际上内存越界造成错误值

1.4K30

熬夜整理万字CC++总结(二),值得收藏

0.为什么使用指针 假如我们定义了 char a=’A’ ,需要使用 ‘A’ ,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 地址,即指向 a 指针 p ,变量 a(...释放置 NULL 指针p指向内存空间释放,没有设置指针p值为NULL。delete和free只是把内存空间释放了,但是并没有将指针p值赋为NULL。...1.1.3 间接访问操作符 通过一个指针访问它所指向地址过程叫做间接访问,或者叫引用指针,这个用于执行间接访问操作符*。...注意:对一个int类型指针引用会产生一个整型值,类似地,对一个float指针引用会产生了一个float类型值。...指针指向内存空间决定了指针步长。指针步长指的是,指针+1候,移动多少字节单位。

1.2K20

C语言被指针手撕

但是指针似乎可以引用修改指向空间值,因此为了防止这种误操作,我们应该用const关键字来修饰该指向常量字符串指针。...思考:一个函数参数部分为一级指针,函数可以接收什么参数?...思考:一个函数参数部分为二级指针,函数可以接收什么参数?...,数组里面有10个元素,每个元素类型一个函数指针,该指针指向函数参数为int,返回值为int; 7.函数指针和函数指针数组用途 在学了函数指针,我们就可能会有这种疑惑:为什么明明能直接使用函数名来调用函数...如果我们把函数指针(地址)作为参数传递给另一个函数,这个指针被用来调用其所指向函数,我们就说这是回调函数。

33200

【C语言】⒉万字带你玩转高阶指针『0»1』

也只有当指针数组中每个元素类型都是char *,才能上面那样指针数组赋值,其他类型不行。...因为一维数组地址,所以在形参当中使用了指向一维数组指针来去进行使用。而这样一维数组+i的话相当于找到了第i行当中地址,引用相当于拿到了第 i 行数组名。...,如果你把函数指针(地址)作为参数传递给另一个函数时候,这个指针被用来调用其所指向函数,我们就说这个回调函数,回调函数不是由函数实现方直接调用,而是在特定时间发生由另外一方进行调用,...printf("%d\n",sizeof(*&a)); //取出a地址再进行引用,指针能够指向数组地址。...通过指针传递方式,形参为指向实参地址指针对形参指向操作,就相当于对实参本身进行操作。

50710

【C语言期末不挂科——指针初阶篇】

这里我们就可以得出结论: 指针类型决定了指针向前或向后走一步步长(距离) 2)指针引用   我们已经知道了指针如何在内存中工作,那么我们该如何将指针给用起来呢?...总结: 指针类型 决定了指针引用时候有多大权限(访问几个字节数) 野指针 1)为什么会有野指针   哎呀,指针真好用!...arr范围,p就是野指针 *(p++) = i;//先引用赋值,再后置++使指针指向下一个位置 } return 0; }   在C语言中,数组名表示数组首元素地址,我们将数组首元素地址给了指针...*ptr2 = &a; printf("%d", ptr1 - ptr2); }   如果采用了不用类型参数进行相减,就会报错,而且最好数组这种连续内存空间使用指针相减,否则相减出来几乎没有什么意义...= 0; }   得到结果同样:   指针比较还有一个要点:就是只能向后比较,但是不能向前比较,如下图: C语言规定了:允许指向数组元素指针指向数组最后一个元素后面的那个内存位置指针比较

7310

【C语言】动态内存开辟使用『malloc』

新分配内存块内容没有初始化,剩下不确定值。 如果size为0,则返回值取决于特定库实现(它可能一个空指针,也可能不是),但返回指针不应被引用。 ...size→内存块大小,以字节为单位。 Size_t一个无符号整型类型。 成功指向函数分配内存块指针。...有效结果分配一个(num*size)字节零初始化内存块。 如果size为0,则返回值取决于特定库实现(它可能一个空指针,也可能不是),但返回指针不应被引用。 ...参数 num → 要分配元素数量。 size →  每个元素大小。 size_t →  无符号整型。 返回值 成功指向函数分配内存块指针。...返回值→一个指向重新分配内存块指针,它可以与ptr相同,也可以是一个新位置。 该指针类型为void*,可以将其转换为所需数据指针类型,以便可引用

76620

手把手教你深入理解cc++中指针

a地址,也就是2000,当我们想通过p来操纵a的话,首先要根据p保存地址找到它指向内容,也就是引用*p,*p内容放生改变时候,首地址为2000内存单元存储值也会做出改变,因此变量*p...因此对q进行引用也即*q得出p,也就是2008,再对(*q)进行引用也即*(*q)得出才是变量a值,由于运算符结合性自右向左,因此括号可以省略,也即**q才是a值。...但是要注意,当用sizeof操作符操作arr时候,这个时候不能把arr当做一个指针来对待,因为sizeof操作数组时候它返回数组字节长度,而单个指针变量只占用四个字节。...不过在这里要特别注意,有一种情况下我们不能通过sizeof操作符来计算数组长度,就是数组名作为函数参数传递时候: void test(int arr[]) { int lenth = sizeof...(arr) / sizeof(int); } 上面这行代码语法上没有问题,但是得出结果却不是我们想要结果,为什么呢,这是因为数组名作为函数传递时候,会退化成一个指针,如果二维数组的话,会退化成指向一维数组指针

45931

《C++Primer》第四章 表达式

简单归纳:一个对象被用作右值,用对象值(内容);对象被用作左值时候,用对象身份(在内存中位置) 在需要右值地方可以用左值来替代,但是不能把右值当成左值(也就是内存中位置)...需要注意引用运算符优先级低于点运算符,所以必须加上括号。...对char或者类型为char表达式执行sizeof,返回1 对引用类型执行sizeof运算得到被引用对象所占空间大小 对指针执行sizeof得到指针本身所占空间大小 对引用指针执行sizeof...运算得到指针指向对象所占空间大小,指针本身不需要有效 对数组执行sizeof运算得到整个数组所占空间大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得结果求和 对string对象或...其他隐式类型转换 数组转换为指针:在大多数用到数组表达式中,数组自动转换为指向数组首元素指针 指针转换:0或nullptr可以转换为任意指针类型;指向任意非常量指针可以转换为void*;指向人以对象指针能转换为

83610

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券