黑马程序员技术交流社区

标题: 怎么利用指针的移动,打印结构体元素 [打印本页]

作者: Makeit    时间: 2015-11-13 01:59
标题: 怎么利用指针的移动,打印结构体元素
怎么利用指针的移动,打印结构体元素,具体看下程
//结构体指针练习
#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;
}
结果运行错误,为什么?能正确的方法吗?
作者: cube川    时间: 2015-11-13 14:09
%s改成%c或者%d试试,我能输出但是有问题。先抛开野指针不说,你看我那张图,前四行,说明平移后再强制转换后地址一样,地址内存的值(也可以叫指针指向的地址)也是一样的。再看后四行,*过之后,就出现问题了,*过之后不只是指向的地址存储的值(最后两行)不一样了,而且和前面对比,存储的值的内存地址(倒数三四行)也不一样了。这么多问题都是首先是m+2指针平移后指向了一个未知的位置,再强制转换,导致问题越来越多。所以不建议用指针平移,毕竟这不是数组。

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

QQ截图20151113135214.png

作者: 能不能行    时间: 2015-11-13 22:21
6666666666
作者: 勇猛的小黑    时间: 2015-11-13 22:42
可以 。不错
作者: Makeit    时间: 2015-11-14 00:13
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.可能结构体就不能这么用吧,但逻辑想不通
作者: Makeit    时间: 2015-11-14 00:14
勇猛的小黑 发表于 2015-11-13 22:42
可以 。不错

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

没越界,内存给结构体分配内存空间时,遵循对齐原则




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2