Типизация Char к типу структуры - PullRequest
1 голос
/ 20 января 2011

Я работал над пробой и как ее часть столкнулся с проблемой следующего типа ...

Для следующего кода

#include<stdio.h>
#include<stdlib.h>
typedef struct sample
{
  int a;
  char b;
}sample;

int main()
{
  char *buf;

  buf = (char *)malloc(sizeof(char)*sizeof(sample));

  buf = ((sample *) buf);
  buf->a = 10;
  buf->b = 'm';
  printf("%d\n",(buf)->a);
  printf("%c\n",(buf)->b);

  return 0;
}

Ошибка времени компиляции:

example.c: 16: ошибка: запрос на член a' in something not a structure or union example.c:17: error: request for member b 'в чем-то, не являющемся структурой или объединением

Это потому, что я не могу типизировать более низкий тип данных к более высокому типу ..??

Я попытался использовать Calloc вместо malloc, чтобы можно было выделить блок смежных операций, но безрезультатно.

Помогите мне найти логический недостаток в этом преобразовании ...

Заранее спасибо

Ответы [ 4 ]

4 голосов
/ 20 января 2011

Йопу должен измениться

char *buf;    
buf = (char *)malloc(sizeof(char)*sizeof(sample)); 

до

sample *buf;    
buf = (sample *)malloc(sizeof(sample)); 

потому что объявление buf как char * не позволяет компилятору понять ваше намерение (указать на пример структуры).

2 голосов
/ 20 января 2011

Строка buf = ((sample *) buf); ничего не делает.Переменная buf все еще имеет тип char*.

sample* sample = (sample*)malloc(sizeof(sample));
sample->a = 10;
sample->b = 'm';
printf("%d\n",(sample)->a);
printf("%c\n",(sample)->b);

Больше похоже на то, что вы хотите.

0 голосов
/ 20 января 2011
Тип

buf по-прежнему char *. Приведение не меняет тип принимающей переменной. Приведение типов, которые вы здесь делаете, по сути бессмысленно - значение указателя не зависит от того, на что он указывает. Память есть память.

Чтобы это исправить, измените тип buf на sample *.

Чтобы исправить это еще больше, уберите приведение с malloc и "переработка" buf после него.

0 голосов
/ 20 января 2011

тип buf не меняется с приведением, вам нужно добавить дополнительную переменную:

char* buf;
sample* s;

buf = malloc(sizeof(sample));
sample = (sample*)buf;

Кстати, sizeof(char) совершенно лишнее, по определению это 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...