不从分配的地址开始访问, 希望跳过一些字节, 怎么处理?
如下一段代码正确么(假设文件名为test.c)?
#include <stdio.h> #include <stdlib.h> int main(void) { void *p = malloc(20); printf("%p\n", p); char *t = (char *)(p + 1); printf("%p\n", t); free(p); return 0; }
使用gcc -S -masm=intel test.c生成intel
格式的汇编
mov DWORD PTR [esp], 20 call _malloc mov DWORD PTR [esp+28], eax mov eax, DWORD PTR [esp+28] mov DWORD PTR [esp+4], eax mov DWORD PTR [esp], OFFSET FLAT:LC0 call _printf mov eax, DWORD PTR [esp+28] add eax, 1 mov DWORD PTR [esp+24], eax mov eax, DWORD PTR [esp+24] mov DWORD PTR [esp+4], eax mov DWORD PTR [esp], OFFSET FLAT:LC0 call _printf mov eax, DWORD PTR [esp+28] mov DWORD PTR [esp], eax call _free
可以看到(char *)(p + 1), 仅仅是将指针p进行加1运算, 其实, 进一步是考虑, 对指针加N, 指针前进"当前指针指向的数据类型的长度*N", 但是void *, 是不知道具体的数据类型是怎样的, gcc这里是将这种情况当做char类型来处理了, 所以地址直接加1, 编译也能通过.
但是同样的代码, 在vc中是通不过编译的, char *t = (char *)(p + 1);这一行和预期的一样, 报错如下:
error C2036: “void *”: 未知的大小
如果要都能通过编译, 其实可以两种做法:
方法一, 其实一个指针可以强制转换为整数的, 就是这个指针的地址值, 对这个值可以做加减, 之后整数也是可以强制转换为指针的, 当做地址使用.
#include <stdio.h> #include <stdlib.h> int main(void) { void *p = malloc(20); printf("%p\n", p); long pt = (long)p; char *t = (char *)(pt + 1); printf("%p\n", t); free(p); return 0; }
方法二, 常规方法, 先得到地址, 指针加+1.
#include <stdio.h> #include <stdlib.h> int main(void) { void *p = malloc(20); long pt = (long)p; char *t = (char *)(p); t++; printf("%p\n", p); printf("%p\n", t); free(p); return 0; }
相关推荐
磨练数年,精诚所致金石为开,对C有自己独身的感悟,解读C语言对你有帮助。
2022年大学c语言学习心得感悟.docx
2022工作报告,c语言结课感悟.docx
C语言指针感悟
分享个人关于I2C总线的感悟。
这是我再培训期间对于指针的学习感悟,我相信能够帮助大家对指针的学习有所帮助。高清的
Java学习总结[C程序员的感悟],绝对值得一看。
关于MFC的优势和缺点的阐述。感悟MFC,感悟技术之路
感悟Hibernate操作数据的方便技术资料
《 操作系统》心得体会 在这个学期,通过学习《操作系统教程》这门课,我对计算机操作系统有了深刻的了解 。 计算机操作系统是铺设在计算机硬件上的多层系统软件,不仅增强了系统的功能,而 且还隐藏了对硬件操作的...
在所给的10个单词中找出不包含元音字母(a,e,i,o,u)的单词,将符合条件的单词的个数以及这些单词按照字典顺序输出。 ⑴ 编写函数int FindNoVowel(char *str[],int num,char res[][20]),str指向的指针数组中...
我的编程感悟
感悟Hibernate_操作数据的方便技术资料
7.2.3 SIMD技术在C语言环境下的使用 196 7.2.4 MMX 编码技巧 197 7.2.5 SIMD 的应用举例 201 7.2.6 SIMD编程注意要点 203 7.2.7 SIMD的性能检测 204 第8章 引擎中的优化 205 8.1 Blit的优化 207 8.2 脏矩形优化 209 ...
DBA:感悟Oracle数据库本质
某天某日某产房,你诞生了(power up , 上电运行),结果你不哭,医生把你提起来,屁股上狠狠一巴掌,你哇哇大哭(reset, 复位成功),护士给你检查,看有没有传染病(EMI测试)、然后打预防针(绝缘处理),没有问题后作记录(QC ...
IT 项目管理资源感悟
“走访优秀校友 感悟奋斗力量”主题实践
游戏之旅-我的编程感悟part2 163主程从游戏开发的视角讲述程序设计的艺术