我编写的用于初始化结构成员的函数存在问题。
#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
的前三个数组存在范围问题?如果最后三个数组是正确的,怎么会这样呢?
错误:
screen->data=(char**)malloc((screen->datsize));
这行不通。将指针分配给任意大小的字节块是没有意义的。您的意思可能是malloc(screen->datsize * sizeof(char*)
。malloc(screen->selsize*sizeof(uint8_t**));
这是错误的,应该是uint8_t*
。您还可以查看正确分配多维数组以及术语灵活数组成员,了解如何以不同方式实现这一点的一些技巧。还要问问自己,您是否确实需要在运行时完全可变的维度,或者这是否可以简化 - 也许您一开始就不需要动态分配。