加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

我可以用分配的内存做我想做的事

发布时间: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工作组正致力于改进严格别名的规范,以澄清这些问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读