как привести от одного типа к другому в с - PullRequest
0 голосов
/ 25 октября 2010

У меня следующий код

#include <stdio.h>
#include<ctype.h>

typedef struct {
  int Type;
  int Type2;
}foo;

typedef struct {
  char cData[40];
}bar;

int main()
{
  bar b1;
  strcpy(b1.cData,"11");
  foo *f=(struct foo *)&b1;
  printf("Type is  %d \n",f->Type);
  return 0;
}

Но я не получаю значение типа 1 в указателе f, вместо этого я получаю размер этой структуры частиц.

Ответы [ 5 ]

4 голосов
/ 25 октября 2010

Когда я запускаю код (после исправления ошибок), он печатает 12593. Что составляет 49 * 256 + 49 - другими словами, «11» - целое число (ascii 1 - 49). Насколько я вижу, в коде нет ничего плохого (кроме предположений о расположении памяти, указанных Бенуа), поэтому нам нужно знать, чего вы ожидаете

#include <stdio.h>
#include<ctype.h>

typedef struct {
  int Type;
  int Type2;
}foo;

typedef struct {
  char cData[40];
}bar;

int main()
{
  bar b1;
  foo *f=(foo *)&b1;
  strcpy(b1.cData,"11");
  printf("Type is  %d \n",f->Type);
  return 0;
}
1 голос
/ 25 октября 2010

после приведения

foo* f = (foo*)&b1

вы интерпретируете строку «11» (которая в формате ASCII представлена ​​как двоичный файл 0x31 0x31), а не как значение 11

     +-------------+
f -> | 0x31 | 0x31 |
     +-------------+

не как

     +-------------+
f -> | 0x01 | 0x01 |
     +-------------+

, если вы хотите видеть 11 в типе после броска, вам нужно будет сделать что-то вроде

strcpy(b1.cData,"\x001\x001");
0 голосов
/ 25 октября 2010

Вы пытаетесь сделать указатель на foo (* f), указывающий на другую структуру 'bar'. foo не сможет указать на этот тип. Следовательно, вы не сможете привести одну структуру к другой.

Указатель может указывать только на те данные, которые используются для объявления указателя.

Попробуйте это:

typedef struct {
  int Type;
  int Type2;
}foo;

typedef struct {
  char s[8];
}bar;

int main()
{
  bar b1;
  strcpy(b1.s,"0x01020304");
  foo *f=(struct foo *)&b1;
  printf("Type is  %d \n",f->Type);
  return 0;
}
0 голосов
/ 25 октября 2010

Ваш каст foo *f=(struct foo *)&b1; неверен, потому что у вас есть typedef foo, а не struct foo. Вместо этого используйте foo *f=(foo *)&b1;. То есть не используйте его вообще, потому что он нарушает строгое правило псевдонимов и является неопределенным поведением.

Вы записываете данные в виде строки и читаете их как int, это следующее неопределенное поведение.

strcpy записывает в структуру только 3 байта (два символа и завершающий \ 0). Предполагая 32-битные числа, четвертый байт int остается неопределенным. Чтение неопределенных значений - опять неопределенное поведение.

Все, что вы получаете в качестве выходных данных, не вызывает удивления, потому что все может происходить при неопределенном поведении.

0 голосов
/ 25 октября 2010

После выполнения вашего кода структура строки выглядит так

| 0x31 | 0x31 | 38 * Рубин .... |

приведение к foo интерпретирует это как int. Когда вы напечатаете его в шестнадцатеричном виде, вы увидите вывод, похожий на этот:

printf("Type is  %x \n",f->Type); 
Type is  b7003131 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...