размер типа данных без использования sizeof - PullRequest
19 голосов
/ 02 августа 2009

У меня есть тип данных, скажем X, и я хочу узнать его размер без объявления переменной или указателя этого типа и, конечно, без использования оператора sizeof.

Возможно ли это? Я думал об использовании стандартных заголовочных файлов, которые содержат размер и диапазон типов данных, но не работают с пользовательским типом данных.

Ответы [ 21 ]

1 голос
/ 22 февраля 2017

Доступно начиная с решения C89, в коде пользователя:

  1. Не объявляет переменную типа X.
  2. Не объявляет указатель на тип X.
  3. Без использования оператора sizeof.

Достаточно легко сделать, используя стандартный код, на что намекает @ Стив Джессоп

offsetof(type, member-designator)

, который расширяется до целочисленного константного выражения, имеющего тип size_t, значением которого является смещение в байтах, до элемента структуры ... от начала его структуры ... C11 §7.19 3

#include <stddef.h>
#include <stdio.h>

typedef struct {
  X member;
  unsigned char uc;
} sud03r_type;

int main() {
  printf("Size X: %zu\n", offsetof(sud03r_type, uc));
  return 0;
}

Примечание: этот код использует "%zu", который требует C99 и выше.

0 голосов
/ 24 июня 2017

вставьте это в свой код

, затем проверьте вывод компоновщика (файл карты)

unsigned int  uint_nabil;
unsigned long  ulong_nabil;

вы получите что-то вроде этого;

uint_nabil 700089a8 00000004
ulong_nabil 700089ac    00000004

4 - это размер !!

0 голосов
/ 29 марта 2015
    main()    
    {
    clrscr();
    int n;
    float x,*a,*b;//line 1
    a=&x;
    b=(a+1);
    printf("size of x is %d",
    n=(char*)(b)-(char*)a);
    }

С помощью этого скрипта кода размер любых данных может быть вычислен без оператора sizeof. Просто измените число с плавающей запятой в строке 1 на тип, размер которого вы хотите вычислить

0 голосов
/ 10 марта 2013

Многие из этих ответов предполагают, что вы знаете, как будет выглядеть ваша структура. Я считаю, что этот вопрос на собеседовании предназначен для того, чтобы попросить вас мыслить нестандартно. Я искал ответ, но не нашел решений, которые мне здесь понравились. Я сделаю лучшее предположение, сказав

struct foo {
  int a;
  banana b;
  char c;
  ...
};

Создав foo [2], я теперь буду иметь 2 последовательных объекта foo в памяти. Итак ...

foo[2] buffer = new foo[2];
foo a = buffer[0];
foo b = buffer[1];

return (&b-&a);

Предполагая, что моя арифметика указателя была правильной, это должен быть билет - и он переносимый! К сожалению, такие вещи, как отступы, настройки компилятора и т. Д. Тоже сыграют свою роль

Мысли

0 голосов
/ 08 октября 2012
#include <stdio.h>

struct {
  int a;
  char c;
};

void main() {
  struct node*temp;
  printf("%d",(char*)(temp+1)-(char*)temp);
}
0 голосов
/ 08 октября 2012
# include<stdio.h>

struct node
{
  int a;
  char c;
};

void main()
{
   struct node*ptr;
   ptr=(struct node*)0;
   printf("%d",++ptr);
}
0 голосов
/ 07 октября 2012

Это код: Хитрость заключается в том, чтобы создать объект указателя, сохранить его адрес, увеличить указатель и затем вычесть новый адрес из предыдущего. Ключевым моментом является то, что когда указатель увеличивается, он фактически перемещается на размер, равный объекту, на который он указывает, поэтому здесь размер класса (на который указывает объект).

#include<iostream>
using namespace std;
 class abc
    {
           int a[5];
           float c;           
    };
main()
{
    abc* obj1;
    long int s1;
    s1=(int)obj1; 
    obj1++;
    long int s2=(int)obj1;
    printf("%d",s2-s1);
}

Привет

0 голосов
/ 12 ноября 2010

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

#define sizeof_type( type )  ((size_t)((type*)1000 + 1 )-(size_t)((type*)1000))

Для следующего пользовательского типа данных,

struct x
{
    char c;
    int i;
};

sizeof_type(x)          = 8
(size_t)((x*)1000 + 1 ) = 1008
(size_t)((x*)1000)      = 1000
0 голосов
/ 03 октября 2017

Один простой способ сделать это - использовать массивы. Теперь мы знаем, что в массивах элементы одного и того же типа данных хранятся в непрерывном блоке памяти. Итак, используя этот факт, я пришел к следующему:

#include <iostream>
using namespace std;

int main()
{
    int arr[2];
    int* ptr = &arr[0];
    int* ptr1 = &arr[1];
    cout <<(size_t)ptr1-(size_t)ptr;
}

Надеюсь, это поможет.

0 голосов
/ 10 сентября 2018
#include <bits/stdc++.h> 

using namespace std; 

int main() 
{ 

    // take any datatype hear 
    char *a = 0; // output: 1

    int  *b = 0;  // output: 4

    long *c = 0; // output: 8

    a++;

    b++;

    c++;

    printf("%d",a);

    printf("%d",b);

    printf("%d",c);

    return 0; 
}
...