las6618 2021-10-21 16:11 采纳率: 100%
浏览 42
已结题

#C语言#在学习分配地址时,为什么取地址后返回了类似index的东西

先上代码(学习阶段,可能写的有些乱):

#include <stdio.h>
#include <malloc.h>

#define c(x) #x
#define ad(x) printf("adress of %s: %lu\n",c(x),&(x))

struct test
    {
        int a;
       char b[1];
    };

void align(void){
    struct test *alignf;
    ad(alignf);
    ad(alignf->a);
    ad(alignf->b);
    alignf = (struct test *)malloc(sizeof(struct test)+4);
    for (size_t i = 0; i < 5; i++)
    {
        alignf->b[i]= i+1;
    }
    printf("\n");
    ad(alignf);
    ad(alignf->a);
    ad(alignf->b);
    free(alignf);
}

int main(){
align();
return 0;
}

运行结果

img

就是这里,为什么这里是0和4啊

如果把for循环去掉或者直接赋值则正常

#include <stdio.h>
#include <malloc.h>

#define c(x) #x
#define ad(x) printf("adress of %s: %lu\n",c(x),&(x))

struct test
    {
        int a;
       char b[1];
    };

void align(void){
    struct test *alignf;
    ad(alignf);
    ad(alignf->a);
    ad(alignf->b);
    alignf = (struct test *)malloc(sizeof(struct test)+4);
    // for (size_t i = 0; i < 5; i++)
    // {
    //     alignf->b[i]= i+1;
    // }
    alignf->b[0] = 2;alignf->b[1] = 2;
    alignf->b[2] = 2;alignf->b[3] = 2;
    alignf->b[4] = 2;
    printf("\n");
    ad(alignf);
    ad(alignf->a);
    ad(alignf->b);
    free(alignf);
}

int main(){
align();
return 0;
}

运行结果

img

  • 写回答

1条回答 默认 最新

  • m0_60988222 2021-10-21 17:19
    关注

    struct test *alignf 这是一个指针,&(alignf)是指针的地址, &(alignf->a) 这东西没用的,一般(alignf->a)就是它的值
    地址建议用%p十六进制打印

    alignf = (struct test *)malloc(sizeof(struct test)*4);
    //动态申请结构体数组,上面你申请sizeof(struct test)+4)个空间,然后强转为struct test *这个指针形式,是个啥
    alignf[0]->b[0] = 2;
    ...
    alignf[3]->b[0] = 2;//正确赋值形式,你上面那个的那个数组成员b都越界了
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月22日
  • 已采纳回答 10月22日
  • 修改了问题 10月21日
  • 创建了问题 10月21日

悬赏问题

  • ¥15 hexo+github部署博客
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了
  • ¥100 H5网页如何调用微信扫一扫功能?