奇怪的结构初始化范围问题?

问题描述 投票:0回答:1

我编写的用于初始化结构成员的函数存在问题。

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

#define START_COL 2
#define MID_COL 30

typedef struct{
    int datsize;
    int selsize;
    char** data;
    uint8_t** seldata;
}Screen;

static const char* HOME_SCREEN[7]={"Ruthless RFID","1.READ CARD","2.WRITE CARD","3.SHOW FILES","4.DISP","5.STATS","6.EXIT"};
static const uint8_t HOME_SEL[6][3]={{2,START_COL,2},{4,START_COL,2},{6,START_COL,2},{2,MID_COL+15,2},{4,MID_COL+15,2},{6,MID_COL+15,2}};

void SCREEN_INIT(Screen* screen){

    screen->datsize=7;
    screen->selsize=6;
    screen->data=(char**)malloc((screen->datsize));
    screen->seldata=(uint8_t**)malloc(screen->selsize*sizeof(uint8_t**));

    for(int i=0;i<screen->selsize;i++){
        screen->seldata[i]=(uint8_t*)malloc(3*sizeof(uint8_t));
        memcpy(screen->seldata[i],HOME_SEL[i],3);
        
    }
    memcpy(screen->data,HOME_SCREEN,sizeof(HOME_SCREEN));
}


int main(){
    Screen HOME;
    
    SCREEN_INIT(&HOME);
    printf("%i\n",HOME.seldata[0][0]);
}

本质上,我使用

HOME
来初始化
HOME_SCREEN[7]
成员,因为它的数据属性是
HOME_SEL[6][3]
,因为它的
seldata
属性。当我检查
HOME.data
中的
main()
时,一切都符合预期。但是,当我尝试打印 HOME.seldata[0][0] 时,我得到 52 而不是 2,这才是应该的。然而,这个:

int main(){
    Screen HOME;
    
    SCREEN_INIT(&HOME);

    printf("%i\n",HOME.seldata[3][0]);
}

返回正确值 2(HOME_SEL 第 4 个数组的第一个元素)。事实上 HOME.seldata 的最后三个数组都是正确的,只是前三个不起作用。但是当我尝试从

HOME.seldata[0][0]
函数中打印
SCREEN_INIT()
时,我得到了正确的值 2。那么这是否意味着
HOME.seldata
的前三个数组存在范围问题?如果最后三个数组是正确的,怎么会这样呢?

c struct scope
1个回答
0
投票

错误:

  • screen->data=(char**)malloc((screen->datsize));
    这行不通。将指针分配给任意大小的字节块是没有意义的。您的意思可能是
    malloc(screen->datsize * sizeof(char*)
  • malloc(screen->selsize*sizeof(uint8_t**));
    这是错误的,应该是
    uint8_t*

您还可以查看正确分配多维数组以及术语灵活数组成员,了解如何以不同方式实现这一点的一些技巧。还要问问自己,您是否确实需要在运行时完全可变的维度,或者这是否可以简化 - 也许您一开始就不需要动态分配。

© www.soinside.com 2019 - 2024. All rights reserved.