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

为什么不能在没有强制转换的情况下指向指针,访问结构成员?

在没有强制转换的情况下指向指针访问结构成员是因为指针和结构体在内存中的存储方式不同。

指针是一个变量,它存储的是一个内存地址,通过这个地址可以找到存储在该地址上的数据。而结构体是一种复合数据类型,它由多个不同类型的成员变量组成,这些成员变量在内存中是连续存储的。

当我们定义一个指向结构体的指针时,指针变量存储的是结构体的起始地址。通过指针访问结构体成员时,需要通过指针的值找到结构体的起始地址,然后再根据结构体成员的偏移量来访问具体的成员变量。

如果在没有强制转换的情况下直接通过指针访问结构体成员,会导致访问的内存地址错误,因为指针的值是一个地址,而结构体成员的偏移量是相对于结构体起始地址的偏移量。这样会导致访问到错误的内存地址,可能会读取到错误的数据,或者修改了不应该修改的数据,从而导致程序出现错误或崩溃。

因此,在访问结构体成员时,必须先通过指针找到结构体的起始地址,然后再通过偏移量来访问具体的成员变量。这可以通过强制转换来实现,将指针转换为结构体类型后再进行访问。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版(CDB):https://cloud.tencent.com/product/cdb
  • 云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 人工智能平台(AI Lab):https://cloud.tencent.com/product/ai
  • 物联网开发平台(IoT Explorer):https://cloud.tencent.com/product/ioe
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

特殊类设计以及C++中类型转换

private,用户自己如果在类外定义了,就可以不能禁止拷贝了 只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,写反而还简单,而且如果定义了就不会防止成员函数内部拷贝了。...用一个成员函数来在堆上创建对象(因为类内能访问私有成员构造函数,类外不可以),那为什么要用static修饰GetObj?...d\n", p, address); } 但是C语言类型转换有很大缺点: 转换可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误转换 隐式类型转化有些情况下可能会出问题:比如数据精度丢失...,但是得是特殊情况: 当指向子类对象时强制类型转换是安全 我们可以用代码验证: class A { public: virtual void f() {} }; class B : public...:" << pb2 << endl; } int main() { A a; B b; fun(&a,"指向父类对象:"); fun(&b,"指向子类对象:"); return 0; } 可以看到指向子类对象时强制类型转换是安全

6410

C++:特殊类设计和四种类型转换

(防自己人)         不定义是因为该函数根本不会调用,定义了其实也没有什么意义,写反而还简单,而且如果定义了就可能导致成员函数进行内部拷贝了。 2、并且将其访问权限设置为私有即可。...注意:这里涉及到是先有鸡还是先有蛋问题,因为如果不去创建这个对象就没有办法去调用他构造函数,但是没有调用构造函数就没有办法创建对象。所以这里必须通过静态成员函数返回值去构造堆对象。...3、为什么 dynamic_cast只能用于父类含有虚函数类 dynamic_cast转换是在运行时进行转换,因为只有对于这种类层次结构,才应该将派生类地址赋给基类指针。...4、dynamic_cast使用原理 父类指针或引用如果本来指向是子类对象,那么类型转化是安全,如果原本指向是父类对象,那么转化是不安全(有越界,但是编译器检查不出来),所以dynamic_cast...:父类对象不能转换成子类对象,但是父类指针和引用可以转换子类指针和引用 B b1; A a; B b; fun(&a); fun(&b); return 0; } 2.3 为什么C++需要四种类型转换

9210

Linux内核第一宏

通过这种强制类型转换后,TYPE结构地址变成了0,那么为什么要做这种转换?它作用是什么? 其实这么做目的只有一个,就是为了更容易拿到成员偏移量。...这就是为什么定义中要通过强制类型转换结构地址变成0,举个例子:现在将结构地址p=0,成员C偏移量(offset)还是4,0+4=4,得到结果正好就是该成员偏移量了。...中,结构地址通过强制类型转换变成了0,我们知道0地址是留给操作系统来使用,这里面的内容是不允许普通程序来访问。...指针 __mptr和指针ptr值是一样,而ptr又是宏container _of一个参数,它是指向type结构体中成员member一个指针,所以 __mptr也指向type结构体中成员member...__mptr前面的char*是为了进行指针运算,以实现逐字节相减。最后通过(type *)强制类型转换指向结构指针。到这里,宏container_of就真相大白了。

1.4K10

《逆袭进大厂》之C++篇49问49答

绝对类型安全编程语言暂时还没有。 (1)C类型安全 C只在局部上下文中表现出类型安全,比如试图从一种结构指针转换成另一种结构指针时,编译器将会报告错误,除非使用显式类型转换。...强制转换,由于类型仍然为Child1*,造成错误 couti<<endl; //输出:5 pp=&c2; pc1=(Child1*)pp; //强制转换,且类型发生变化...第一个例子用到了空类型指针void*,第二个例子则是在两个类型指针之间进行强制转换。因此,想保证程序类型安全性,应尽量避免使用空类型指针void*,尽量不对两种类型指针强制转换。...33、为什么析构函数一般写成虚函数 由于类多态性,基类指针可以指向派生类对象,如果删除该基类指针,就会调用该指针指向派生类析构函数,而派生类析构函数又自动调用基类析构函数,这样整个派生类对象完全被释放...public变量和函数在类内部外部都可以访问。 protected变量和函数只能在内部和其派生类中访问。 private修饰元素只能在类内访问

1.9K10

《逆袭进大厂》之C++篇49问49答(绝对干货)

绝对类型安全编程语言暂时还没有。 (1)C类型安全 C只在局部上下文中表现出类型安全,比如试图从一种结构指针转换成另一种结构指针时,编译器将会报告错误,除非使用显式类型转换。...强制转换,由于类型仍然为Child1*,造成错误 couti<<endl; //输出:5 pp=&c2; pc1=(Child1*)pp; //强制转换,且类型发生变化...第一个例子用到了空类型指针void*,第二个例子则是在两个类型指针之间进行强制转换。因此,想保证程序类型安全性,应尽量避免使用空类型指针void*,尽量不对两种类型指针强制转换。...33、为什么析构函数一般写成虚函数 由于类多态性,基类指针可以指向派生类对象,如果删除该基类指针,就会调用该指针指向派生类析构函数,而派生类析构函数又自动调用基类析构函数,这样整个派生类对象完全被释放...public变量和函数在类内部外部都可以访问。 protected变量和函数只能在内部和其派生类中访问。 private修饰元素只能在类内访问

2.5K40

C++面试题

纯虚函数和虚函数表 如果类中存在虚函数,那么该类大小就会多4个字节,然而这4个字节就是一个指针大小,这个指针指向虚函数表,这个指针将被放置与类所有成员之前。...对于多重继承派生类来说,它含有与父类数量相对应虚函数指针。 2. 为什么基类构造函数不能定义为虚函数?...从使用角度,虚函数主要用于在信息不全情况下,能使重载函数得到对应调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。...强制类型转换 特点: 数据范围从大到小转换,需要进行特殊格式处理,会损失精度。...我们没必要再为共享内存设计其他额外数据结构,另外,STL高度可扩展性将为IPC所驱使。STL容器被良好封装,默认情况下有它们自己内存管理方案。

1.7K42

整理了70道C语言与C++常见问答题

C语言结构体中数据成员没有private、public和protected访问限定。而C++成员有这些访问限定。 C语言结构体是没有继承关系,而C++类却有丰富继承关系。...在类内部(定义类代码内部),无论成员被声明为 public、protected 还是 private,都是可以互相访问没有访问权限限制。...4、reinterpret_cast 几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用; 5、为什么不使用C强制转换?...,如:shared_ptr p = pa->pb_.lock(); p->print(); 39 说说强制类型转换运算符 「static_cast」 用于非多态类型转换 执行运行时类型检查(转换安全性不如...因为插入操作只是结点指针换来换去,结点内存没有改变。而iterator就像指向结点指针,内存没变,指向内存指针也不会变。

3K01

基础知识_Cpp

当在类内声明一个友元函数时,该函数可以访问私有成员。当在类内声明友元类时,则友元类可以访问当前类私有成员。...1.结构体内成员对齐规则:第一个成员偏移为0,其他每个成员开始地址需要是min(当前成员大小,默认对齐字节)整数倍。...2.结构对齐规则:偏移地址需要是min(“默认对齐字节”,结构体内最宽成员)整数倍。 3.结构体总大小:内部最宽基本类型整数倍。...推荐阅读《STL源码剖析》 & 知无涯之std::sort源码剖析 另sort为什么直接用稳定堆排序实现?堆排序在排序过程中是跳跃式地访问元素,缓存命中率较低。...实现一个shared_ptr智能指针 000000 参考:技术: C++ 智能指针实现 shared_ptr线程安全性 C++11四种强制类型转换 1.static_case(静态转换) 主要执行非多态转换操作

1.9K30

赵晨雨: 从微观角度来看linux内核设计

成员地址好说,我们直接传进来了,偏移是通过offsetof来实现,来看看这个offsetof:将0强制类型转换成这个结构指针类型,然后访问这个成员,加上&得到它偏移,返回。...再来看(char *)__mptr,这个通过第四行代码可以很容易得出它是成员地址,为什么强制转换成char *呢?转换成int *不行吗?...在最后,再次强制类型转换指向这个结构指针类型。...既然是中转,那么类型就必须要求一致了,所以我们要得到和这个成员一致类型,就通过typeof来得到了,将0强制类型转换成这个这个结构指针类型,然后访问这个变量,(注意仔细看代码,这里代码和offsetof...非常类似)这里没有使用&,所以只是访问到变量了,没有得到偏移。

74420

嵌入式笔试面试题目系列(二)

而malloc内存分配成功则是返回void*,需要通过强制类型转换将void*指针转换成我们需要类型。 4)new内存分配失败时,会抛出bad_alloc异常。...: 1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上任意数据;某些硬件平台只能在某些地址处取某些特定类型数据,否则抛出硬件异常。...2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐内存,处理器需要作两次内存访问;而对齐内存访问仅需要一次访问。...a5 :局部易变变量; 14、使用32位编译情况下,给出判断所使用机器大小端方法。 ? 联合体方法判断方法:利用union结构从低地址开始存,且同一时间内只有一个成员占有内存特性。...int强制类型转换成char单字节,p指向a起始字节(低字节) #include int main () { int a = 1; char *p = (char

63630

C++知识概要

构造函数为什么不能为虚函数 虚函数对应一个指向虚函数表指针,但是这个指向vtable 指针事实上是存储在对象内存空间。...野指针指向内存被释放内存或者没有访问权限内存指针。它成因有三个:1. 指针变量没有被初始化。2. 指针 p 被 free 或者 delete 之后,没有置为 NULL。...平台原因(移植原因) 不是所有的硬件平台都能访问任意地址上任意数据; 某些硬件平台只能在某些地址处取某些特定类型数据,否则抛出硬件异常 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐...用于类层次结构中父类和子类之间指针或引用转换,2. 进行下行转换(把父类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全,3....即使你并没有写 this 指针,编译器在链接时也会加上 this ,对各成员访问都是通过 this

1.1K20

C语言与C++面试知识总结

修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。 this 指针 this 指针是一个隐含于每一个非静态成员函数中特殊指针。...struct 作为数据结构实现体,它默认数据访问控制是 public ,而 class 作为对象实现体,它默认成员变量访问控制是 private 。...this 成员函数 必须保证成员函数 delete this 后面没有调用 this 了 必须保证 delete this 后没有人使用了 定义只在堆(栈)生成对象类 只能在堆上 方法:将析构函数设置为私有...若析构函数不可访问,则不能在栈上创建对象。...static_cast 用于非多态类型转换 执行运行时类型检查(转换安全性不如 dynamic_cast) 通常用于转换数值数据类型(如 float -> int) 可以在整个类层次结构中移动指针

4.9K41

什么?CC++面试过不了?因为你还没看过这个!

修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。 this 指针 this 指针是一个隐含于每一个非静态成员函数中特殊指针。...struct 作为数据结构实现体,它默认数据访问控制是 public ,而 class 作为对象实现体,它默认成员变量访问控制是 private 。...this 成员函数 必须保证成员函数 delete this 后面没有调用 this 了 必须保证 delete this 后没有人使用了 定义只在堆(栈)生成对象类 只能在堆上 方法:将析构函数设置为私有...若析构函数不可访问,则不能在栈上创建对象。...static_cast 用于非多态类型转换 执行运行时类型检查(转换安全性不如 dynamic_cast) 通常用于转换数值数据类型(如 float -> int) 可以在整个类层次结构中移动指针

3.6K50

硬核 | C++ 基础大全

所以不能在声明中初始化 const 数据成员,因为类对象在没有创建时候,编译器不知道 const 数据成员值是什么。const 数据成员初始化只能在构造函数初始化列表中进行。...,对类所有对象只有一份拷贝; 在类中 static 成员函数属于整个类所拥有,这个函数接收 this 指针,因而只能访问 static 成员变量。...类成员函数是没有 this 指针,this 指针指向本对象指针,正因为没有 this 指针,所以 static 类成员函数不能访问非 static 成员,只能访问 static修饰成员; static...**类型转换:**C++ 中有数据类型隐含转换机制,Java 中需要限时强制类型转换。...结构体内存对齐方式和为什么要进行内存对齐?

1.2K10

Go看源码必会知识之unsafe包

上面示例中,指针pv指向空间本是一个双精度数据,占8个字节,但是经过转换后,p指向是一个4字节int类型。这种发生内存截断设计缺陷会在转换后进行内存访问是存在安全隐患。...没有任何字段空struct{}和没有任何元素array占据内存空间大小为0,不同大小为0变量可能指向同一块地址。...: number:addr:0xc000018090, value:5 float64:addr:0xc000018090, value:3.000000 由运行可知使用unsafe.Pointer强制类型转换指针指向地址是没有改变...然后我们在看Offsetof函数,我想要修改结构体中成员变量,第一个成员变量是不需要进行偏移量计算,直接取出指针转换为unsafe.pointer,在强制给他转换成字符串类型指针值即可。...因为如果有指针指向该字段, 返回地址将在结构体之外,如果此指针一直存活释放对应内存,就会有内存泄露问题(该内存不因结构体释放而释放)。

22220

《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

4) 在类中static成员变量属于整个类所拥有,对类所有对象只有一份拷贝; 5) 在类中static成员函数属于整个类所拥有,这个函数接收this指针,因而只能访问static成员变量...类成员函数是没有this指针,this指针指向本对象指针。...正因为没有this指针,所以static类成员函数不能访问非static成员,只能访问 static修饰成员; 8) static成员函数不能被virtual修饰,static成员不属于任何对象或实例...我们再来补充一下静态成员函数存放问题:静态成员函数与一般成员函数唯一区别就是没有this指针,因此不能访问非静态数据成员,就像我前面提到,所有函数都存放在代码区,静态函数也例外。...自从类函数定义完成后,它就在那儿,不会跑 D. this指针是如何访问类中变量? 如果不是类,而是结构体的话,那么,如何通过结构指针访问结构变量呢?

2.3K40

【C语言】自定义类型(结构体、位段、枚举、联合体)

这样我们就可以通过这个指针去维护这个结构体,这也就是结构自引用, 这里我们在介绍一下,结构自引用概念,官方解答一下: 结构自引用就是,在结构体内部包含一个指向自身结构体类型指针,我们就能用指针维护结构成员...(指针)->运算优先级要高于()强制类型转换 代码解释,我们知道一个结构成员大多数情况下会放在栈区中,每个成员地址之间都是相差几个字节,如果我们能把这些地址强制类型转换成int型数据,那他们每个成员与收成员地址之间差其实就是每个成员偏移量...这样就好解决这个问题了,假设首成员地址为0的话,那么下面的地址其实就是他们每个成员偏移量(现在还是地址形式,只要强制转换成int型就是偏移量了) 所以我们先将0强制转换结构体类型指针(也就是地址...,因为指针就是地址,地址就是指针),然后我们在通过这个指针去选择我们成员,也就是维护结构体内部成员,然后我们在取出内部成员地址,将其转换成int型数据,那这样我们就很轻松拿到不同成员偏移量了 这里可能对于新手来说...S*,因为这个结构指针首先指向是首成员嘛,所以他也就是首成员地址 1.9结构体传参 struct S { int data[1000]; int num; }; struct S s = {{

46530

C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

,malloc返回void*指针,需要强制类型转换 new可以被重载,malloc不能 10、new和delete是如何实现?...使用命名强制类型转换函数const_cast时,只能改变运算对象底层const。...都是是指向无效内存区域(这里无效指的是"不安全不可控")指针访问行为将会导致未定义行为。 野指针,指的是没有被初始化过指针。...static成员变量属于整个类所拥有,对类所有对象只有一份拷贝; 在类中static成员函数属于整个类所拥有,这个函数接收this指针,因而只能访问static成员变量。...正因为没有this指针,所以static类成员函数不能访问非static成员,只能访问 static修饰成员; static成员函数不能被virtual修饰,static成员不属于任何对象或实例

1.9K20

offsetof(s,m)解析「建议收藏」

(s *)0 是骗编译器说有一个指向类(或结构)s指针,其值为0 &((s *)0)->m 是要取得类s中成员变量m地址 由于这个类(或结构基址为0,这时m地址当然就是...m在s中偏移了 (s *)0 是把0地址转换为s指针类型,然后从这个指针上“取”m成员再取址,而m成员地址转换后结果就是m成员相对于整个对象偏移量(我们既然是从0地址开始算,就不用再减去起始地址...下面拿KEIL 8051定义来作点解释: ((s *)0):强制转化成数据结构指针,并使其指向地址0; ((s *)0)->m:使该指针指向成员m &(((s *)0)->m):获取该成员...m地址 (size_t)&(((s *)0)->m):转化这个地址为合适类型 你可能会迷惑,这样强制转换结构指针怎么可以用来访问结构体字段?...ANSI C标准允许任何值为0常量被强制转换成任何一种类型指针,并且转换结果是一个NULL指针,因此((s*)0)结果就是一个类型为s*NULL指 针。

29320

面试总结-C++

起到了隐藏作用 在类 static 成员变量属于整个类所拥有,对类所以对象只有一份拷贝 在类中 static 成员函数属于整个类所拥有,这个函数接收 this 指针,因而只能访问 static...int (* ( * fp3)())[10](); //fp3是一个指针指向一个函数,函数没有参数,函数返回值为一个指针指针指向一个数组,数组中有10个元素,每个元素是一个函数指针,函数没有参数,...用sizeof来返回类型以及静态分配对象、结构或数组所占空间,返回值跟对象、结构、数组所存储内容没有关系;strlen是字符处理库函数,当数组名作为参数传入时,实际上数组就退化成指针了。。...见为什么不能建立引用数组 将引用作为函数参数时,可以避免对变量或者对象复制,因此不会调用对象拷贝构造函数。当希望传入引用参数不被改变时,使用const引用。...对于C++来说,有些操作也不是类型安全,比如不同类型指针之间可以强制转换(reinterpret cast) 注:C#、Java是类型安全 C++使用得当,可以远比C更有类型安全性。

2.1K11
领券