我可以用分配的内存做我想做的事
发布时间:2020-12-16 10:05:22 所属栏目:百科 来源:网络整理
导读:我可以对分配的内存做些什么限制?(标准) 例如 #include stdio.h#include stdlib.hstruct str{ long long a; long b;};int main(void) { long *x = calloc(4,sizeof(long)); x[0] = 2; x[3] = 7;//is anything beyond here legal( if you would exclude poss
我可以对分配的内存做些什么限制?(标准)
例如 #include <stdio.h> #include <stdlib.h> struct str{ long long a; long b; }; int main(void) { long *x = calloc(4,sizeof(long)); x[0] = 2; x[3] = 7; //is anything beyond here legal( if you would exclude possible illegal operations) long long *y = x; printf("%lldn",y[0]); y[0] = 2; memset (x,16); struct str *bar = x; bar->b = 4; printf("%lldn",bar->a); return 0; } 总结一下: >只要大小适合,我可以重命转指向其他数据类型和结构的指针吗? 解决方法
从y [0]读取违反严格别名规则.使用long long类型的左值来读取有效类型long的对象.
假设你省略了那条线;下一个麻烦的部分是memset(x,16);. This answer认为memset不会更新有效类型.标准尚不清楚. 假设memset保持有效类型不变;下一个问题是阅读bar-> a. C标准对此也不清楚.有人说bar-> a暗示(* bar).a这是一种严格的别名违规,因为我们没有先将条形对象写入该位置. 其他人(包括我)说它很好:用于访问的唯一左值是bar-> a;这是long long类型的左值,它访问有效类型long long的对象(由y [0] = 2;写的那个). 有一个C2X工作组正致力于改进严格别名的规范,以澄清这些问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |