c - 二级指针与地址问题

查看:94
本文介绍了c - 二级指针与地址问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

各位老哥,昨天上机有道题百思不得其解,在此诚恳的发文,希望有朋友们多多指教,我已经快疯了.
问题描述如下,如有描述不清楚的地方,欢迎评论指出.

如下结构体:

typedef struct student
{
    int age;
    int height;
}stu;

typedef struct school
{
    int num;
    stu **boys;
}grade;

我的目的是让结构体grade(班级)中包含学生的个数与指向学生结构体的二级指针。(当然有更好的实现比如柔性数组,我们就讨论这个二级指针的形式)

做如下操作.

假设有结构体


    stu *tmp = NULL;
    
    grade oneclass;
    //定义班级男生个数
    oneclass.num = 55;
    
    grade *one=&oneclass;

声明了结构体grade和指向结构体grade的指针.

然后我去申请一片内存


    //申请内存
    tmp = malloc(oneclass.num*sizeof(stu));
    
    one->boys = &tmp;

那么问题来了:
如何通过多种方法访问申请的内存块.
最后附上我写的源码,方便各位老哥调试程序:


#include <stdio.h>
#include <stdlib.h>

typedef struct student
{
    int age;
    int height;
}stu;

typedef struct school
{
    int num;
    stu **boys;
}grade;

int main()
{
    stu *tmp = NULL;
    
    grade oneclass;
    //定义班级男生个数
    oneclass.num = 55;
    
    grade *one=&oneclass;
    
    //申请内存
    tmp = malloc(oneclass.num*sizeof(stu));
    
    one->boys = &tmp;
    
    //如何通过tmp 和结构体指中boyes指针来操作 申请的内存,请打印第一个 第二个 第N个元素地址(两种方式打印)
    
    return 0;
}

解决方案

    int i = 0;
    for (i=0; i<55; i++)
    {
        printf("%p %p %p\n", tmp+i, &tmp[i], *one->boys+i);
    }

这样子打印出来的3个值是一样的。
而且,tmp[1]并没有指向55*8之后

for (i=0; i<55; i++)
{
    tmp[i].age = i;
}
for (i=0; i<55; i++)
{
    printf("%d ", (*one->boys)[i].age);
}
// 输出:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

这篇关于c - 二级指针与地址问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆