结构体指针 +1的疑惑
下面的语句摘自“C和指针”:px+1的右值:如果px指向一个结构数组的元素,这个表达式将指向该数组的下一个结构。但,就算如此,这个表达式任然是非法的,因为我们没有办法分辨...
下面的语句摘自“C和指针”:
px+1的右值:如果px指向一个结构数组的元素,这个表达式将指向该数组的下一个结构。但,就算如此,这个表达式任然是非法的,因为我们没有办法分辨内存下一个位置所存储的是这些结构元素之一还是其他东西。
c prime plus 里明确说明类似px+1的操作将指向该数组的下一个结构。自己试验也说明类似px+1是可以的。难道“C和指针”错了么?还是特定情况下没有办法分辨内存下一个位置所存储的是这些结构元素之一还是其他东西?
谢谢缪立军,你的意思是说数组越界么?如果不越界什么情况下会出现下一个位置是其它类型的变量? 展开
px+1的右值:如果px指向一个结构数组的元素,这个表达式将指向该数组的下一个结构。但,就算如此,这个表达式任然是非法的,因为我们没有办法分辨内存下一个位置所存储的是这些结构元素之一还是其他东西。
c prime plus 里明确说明类似px+1的操作将指向该数组的下一个结构。自己试验也说明类似px+1是可以的。难道“C和指针”错了么?还是特定情况下没有办法分辨内存下一个位置所存储的是这些结构元素之一还是其他东西?
谢谢缪立军,你的意思是说数组越界么?如果不越界什么情况下会出现下一个位置是其它类型的变量? 展开
5个回答
Sievers分析仪
2024-10-13 广告
2024-10-13 广告
是的。传统上,对于符合要求的内毒素检测,最终用户必须从标准内毒素库存瓶中构建至少一式两份三点标准曲线;必须有重复的阴性控制;每个样品和PPC必须一式两份。有了Sievers Eclipse内毒素检测仪,这些步骤可以通过使用预嵌入的内毒素标准...
点击进入详情页
本回答由Sievers分析仪提供
展开全部
应该说的都没错
如果px+1的下一个地址仍然是该结构体的变量实例,那么应该不会出错,如果下一个位置是其它类型的变量,应该就会报错,“C和指针”里说的应该是这个意思。“c prime plus”里面应该是默认了下一个位置还是这种结构体的变量
如果px+1的下一个地址仍然是该结构体的变量实例,那么应该不会出错,如果下一个位置是其它类型的变量,应该就会报错,“C和指针”里说的应该是这个意思。“c prime plus”里面应该是默认了下一个位置还是这种结构体的变量
追问
谢谢缪立军,你的意思是说数组越界么?如果不越界什么情况下会出现下一个位置是其它类型的变量?
追答
在vc中试验了一下,不越界是完全可以操作的,越界了程序不会报错,指向的还是该类型的结构体,只是它的变量没有初始化,如果前面对越界的结构体变量进行初始化,还是可以正常拿到结果。
#include "stdio.h"
struct test
{
char x;
char y;
};
void main()
{
test* t;
test* h;
test* y = new test[2];
y[1].x = '3';
y[2].x = '4';
printf("%c %c %c %c\n",y->x,(y+1)->x,(y+2)->x,(y+3)->x);
}
这段程序的输出是
? 3 4 ?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
理解字面意思太烦了,不过可以这样说:
Type *px; Type是数据类型,可以是结构体等
px+1表示px移动sizeof(Type)个字节的内存地址
移动这些位置后是什么地方,需要程序员明白,自己检查是否越界,
比如char是一个字节,int是4字节,你可以调试这样的代码:
char *p;
int a=123456789;
p=(char*)&a;
printf("%c,%c,%c,%c/n",p[0],p[1],p[2],p[3]);
Type *px; Type是数据类型,可以是结构体等
px+1表示px移动sizeof(Type)个字节的内存地址
移动这些位置后是什么地方,需要程序员明白,自己检查是否越界,
比如char是一个字节,int是4字节,你可以调试这样的代码:
char *p;
int a=123456789;
p=(char*)&a;
printf("%c,%c,%c,%c/n",p[0],p[1],p[2],p[3]);
追问
觉得这里说的“不合法”并不是越界情况,见C和指针第六章关于指针的详细论述。另外注意此处“是这些结构元素之一还是其他东西?”而不是说是不是数组元素。强调的是“结构元素之一”。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
“但,就算如此,这个表达式任然是非法的”,这句话的意思是说,你不知道这个数组有多少个成员,如果,px所指向的是数组中最后的一个结构体,那么,px+1就是非法的了。因为你根本就没有为程序申请这段内存。因为不确定性,所以归结为不合理中。
更多追问追答
追问
觉得这里说的“不合法”并不是越界情况,见C和指针第六章关于指针的详细论述。另外注意此处“是这些结构元素之一还是其他东西?”而不是说是不是数组元素。强调的是“结构元素之一”。
追答
有时候我真的发现无法和你们有效的交流,你们看别人回答的时候,也请你们思考思考,别人为什么这样回答你,还有,有些东西,你以为是2个不同的,但是实际上他们就是一个东西,只是叫法不一样而已。在我看来你的问题就只有一个意思。
我建议你还是看一下专业的,关于c语言程序的内存方面的书籍。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
px+1本身没有问题,但是px+1作为左值是非法的。px可以作为左值,但是px+1不可以。如果int a=10,b=15,*px=&a,如果a地址为2000H,那么px存放的值为2000H,那么px+1就表示2004H,如果有这样一个式子px+1=&a,这样合法吗?这与a+1=b在一定程度上是等价的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询