c - c语言,指针运算
问题描述
我有以下代码
void main(void) {
int data = 0x5555;
int* dataptr = &data;
int** dataptrptr = &dataptr;
int*** dataptrptrptr = &dataptrptr;
printf("%d\n", ***dataptrptrptr);
}
data
在地址0xabcd
dataptr
在地址0x1234
dataptrptr
在地址0x8888
dataptrptrptr
在地址0xffff
是否正在读取有效地址*((*dataptrptrptr) + 4)
0x8888 + 4 = 0x888c
?
另外,表达式的值是**dataptrptrptr
0x1234 吗?
解决方案
*((*dataptrptrptr) + 4) 0x8888 + 4 = 0x888c 是否正在读取有效地址?
也许 - 这取决于
*dataptrptrptr
是0x8888
,但地址并不像整数那么简单。
将 4 作为整数添加到 0x8888 是 0x888C。
作为一个指针,将 4 加到int**
0x8888 将int**
在内存中进一步形成地址 4 指针。
如果int **
指针是 8 个字节,并且地址在字节地址上递增,则预期总和为int**
0x88A8。
如果int **
指针是 4 字节并且地址在字节地址上递增,则预期总和为int**
0x8898。
如果一个int **
指针是 N 字节,并且如果 int **
它位于内存中的一个特殊位置,地址是在 N 字节块中,那么预期的总和是int**
0x888C。
但存在其他可能性:0x8890、pointer_street:0x0004、未定义行为等。
指针数学不是整数数学。
表达式的值**dataptrptrptr
是int *
指针 0x1234。
推荐阅读
- heroku - 使用 Heroku Pipelines 同时部署前端和后端
- java - 如何以编程方式设置自定义布局属性
- c++ - 在固定大小的数组上展开 C++ 中的循环是否有益?
- javascript - 如何以编程方式在 Lighthouse 中设置自定义配置?
- java - 减少一个 Map,其中键是某些条目中的值
- java - 找不到 java.lang.AutoCloseable 的类文件 - ActiveMQ 代码
- python - 如何在不改变稀疏度的情况下将稀疏 scipy 矩阵的切片乘以常数
- python - 在elasticsearch中删除嵌套数组
- mongodb - 如何使用 mongodb 获取对象内部的计数对象
- scala - 如何将 Scala/spark 与 drools 连接起来,性能如何?