почему мы снова создаем переменную структуры из структуры объекта? - PullRequest
2 голосов
/ 07 февраля 2020

Я новичок в с ++. Вот мое сомнение, почему в этой программе они снова создают переменную структуры из ранее созданного объекта структуры? Вот пример:

typedef struct prog1
{

int a,b;

}*obj1;

int main()
{

obj1 moc=new prog1(); // why again creating object for *obj1 object?
moc->a=10;  // why dont we use obj1 -> a=10;

}

спасибо

Ответы [ 3 ]

5 голосов
/ 07 февраля 2020

obj1 - это не объект, а определение типа, поскольку оно является частью определения typedef. А именно, это тип prog1* (указатель на prog1). obj1 moc объявляет переменную этого типа, то есть moc является указателем на prog1.

3 голосов
/ 07 февраля 2020

Для большей ясности используйте объявление псевдонима вместо определения typedef.

struct prog1
{

int a,b;

};

using obj = struct prog1 *;

Таким образом, имя obj является псевдонимом для типа struct prog1 *. obj не является переменной.

Таким образом, в этом объявлении

obj1 moc; 

определена переменная moc с типом obj. Это объявление эквивалентно следующему объявлению

prog1 *moc;

То есть там объявлен указатель типа prog1 *.

Обратите внимание, что указатель не инициализирован. Так что это имеет неопределенное значение. В результате следующий оператор

moc->a=10;

вызывает неопределенное поведение.

2 голосов
/ 07 февраля 2020

вам не нужно использовать typedef перед структурой. вы можете напрямую использовать prog1 как тип. например:

struct prog1 {
    int a,b;
} obj1;   //<---create right away the obj1.

int main() {
   prog1 obj2;  //<---another object created.
   prog1 *pObj = new prog1();

   obj1.a = 10;
   obj2.a = 20;
   pObj->a = 30;
   //...
}

или вам даже не нужно имя структуры prog1. как это:

struct {
    int a,b;
} obj1, obj2, *pObj;   //<---obj1 and obj2 already has allocated space for data.

int main() {
   pObj = new prog1();  //<---allocate data space that will be pointed by pObj.

   obj1.a = 10;
   obj2.a = 20;
   pObj->a = 30;
   //...
}
...