A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

怎么利用指针的移动,打印结构体元素,具体看下程
//结构体指针练习
#include <stdio.h>
int main()
{
    struct person{int num;char *sign;};
    struct person per ={5,"nihao"};
    int *m=&per.num;
   
    printf("%s\n",*((char *)(m+2)));
    return 0;
}
结果运行错误,为什么?能正确的方法吗?

10 个回复

倒序浏览
%s改成%c或者%d试试,我能输出但是有问题。先抛开野指针不说,你看我那张图,前四行,说明平移后再强制转换后地址一样,地址内存的值(也可以叫指针指向的地址)也是一样的。再看后四行,*过之后,就出现问题了,*过之后不只是指向的地址存储的值(最后两行)不一样了,而且和前面对比,存储的值的内存地址(倒数三四行)也不一样了。这么多问题都是首先是m+2指针平移后指向了一个未知的位置,再强制转换,导致问题越来越多。所以不建议用指针平移,毕竟这不是数组。

QQ截图20151113135214.png (16.81 KB, 下载次数: 148)

QQ截图20151113135214.png
回复 使用道具 举报
6666666666
回复 使用道具 举报
可以 。不错
回复 使用道具 举报
cube川 发表于 2015-11-13 14:09
%s改成%c或者%d试试,我能输出但是有问题。先抛开野指针不说,你看我那张图,前四行,说明平移后再强制转换 ...

1.对强制转换后,  地址是不会变的,只是步长信息会变,   m+2则取值时*(m+2)取得是m+2开始4个字节的内容,是数值;而(char *)(m+2)后,地址没变,但步长变了,里面存的信息也默认为地址(而不是数值)了,强转后,*(m+2)取得是m+2开始8个字节的内容(指针占8个字节),是地址,按理说这样是能打印出来的,但我打出来是乱码,%c,%d也不行
2.m+2不是野指针,它和&per.sign的地址值一样,你用%p打印一下试试
3.可能结构体就不能这么用吧,但逻辑想不通
回复 使用道具 举报

你用的什么编译的?
回复 使用道具 举报
cube川 中级黑马 2015-11-14 22:11:10
7#
我用的CB,编译器不一样结果可能不同,再说指针平移是数组里面的东西,结构体的话除非你定义个数组的元素,比如说   char name[100],这样能用指针平移对name[100]进行操作就没问题了。
回复 使用道具 举报
666666666666666
回复 使用道具 举报
Meracle 中级黑马 2015-11-16 01:24:29
9#
int类型的指针m加2之后,相当于移动了两个int的大小,已经越界啊
回复 使用道具 举报
我也搞不明白
回复 使用道具 举报
Makeit 中级黑马 2015-11-17 01:10:42
11#
Meracle 发表于 2015-11-16 01:24
int类型的指针m加2之后,相当于移动了两个int的大小,已经越界啊

没越界,内存给结构体分配内存空间时,遵循对齐原则
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马