Я пытаюсь узнать больше о C и его тайных скрытых способностях, и я попытался создать образец структуры, содержащий указатель на пустоту, предназначенный для использования в качестве массива.РЕДАКТИРОВАТЬ: Важное примечание: это для необработанного кода C.
Допустим, у меня есть эта структура.
typedef struct mystruct {
unsigned char foo;
unsigned int max;
enum data_t type;
void* data;
} mystruct;
Я хочу, чтобы данные содержали макс любых неподписанных символов, unsigned short int и unsigned long int, перечисление data_t содержит значения для этих трех случаев.
enum Grid_t {gi8, gi16, gi32}; //For 8, 16 and 32 bit uints.
Затем у меня есть эта функция, которая инициализирует и выделяет одну из этих структур, и должна возвращать указательв новую структуру.
mystruct* new(unsigned char foo, unsigned int bar, long value) {
mystruct* new;
new = malloc(sizeof(mystruct)); //Allocate space for the struct.
assert(new != NULL);
new->foo = foo;
new->max = bar;
int i;
switch(type){
case gi8: default:
new->data = (unsigned char *)calloc(new->max, sizeof(unsigned char));
assert(new->data != NULL);
for(i = 0; i < new->max; i++){
*((unsigned char*)new->data + i) = (unsigned char)value;
//Can I do anything with the format new->data[n]? I can't seem
//to use the [] shortcut to point to members in this case!
}
break;
}
return new;
}
Компилятор не возвращает предупреждений, но я не слишком уверен в этом методе.Это законный способ использования указателей?
Есть ли лучший способ ©?
Я пропустил это.как mystruct * P;P = новый (0,50,1024);
Союзы интересны, но не то, что я хотел.Так как мне все равно придется подходить к каждому конкретному случаю индивидуально, кастинг выглядит так же хорошо, как объединение.Я специально хотел иметь гораздо большие 8-битные массивы, чем 32-битные, поэтому объединение, похоже, не помогает.Для этого я бы сделал массив длинных: P