C, C++ / Обнуление в структуре, указатель+адрес

154
08 ноября 2019, 04:30

В с++ в структуре элементам присваивается ноль, а когда я пытаюсь сделать это в си, мне выдает ошибку, как можно исправить/заменить?

struct example {example *p=NULL;}

И еще один пример из с++, который не работает на си, когда вызываю функцию, выдает ошибку на "*&"

void function(spis *&h);
Answer 1

В C в отличии от C++ вы не можете в объявлении структуры указывать инициализаторы.

Поэтому данное объявление структуры

struct example {example *p=NULL;};

не будет компилироваться. Более того в C данное объявление также некорректно по другой причине: имя example не является именем структуры. Необходимо его предварить ключевым словом struct. Например

struct example { struct example *p; };

В принципе нет необходимости использовать инициализатор внутри объявления структуры. Вы всегда можете инициализировать соответствующие поля при создании объекта структуры или присвоить им значения уже после создания объекта структуры. Например,

include

В C:

struct example
{
    struct example *p;
};
int main( void )
{
    struct example list = { NULL };
}

Или

#include <stdlib.h>
struct example
{
    struct example *p;
};
int main( void )
{
    struct example *list = malloc( sizeof( struct example ) );
    list->p = NULL;
    //...
    free( list );
}

Что касается этого объявления

void function(spis *&h);

то в C++ параметр является ссылочным типом на указатель типа spis * . В C ссылочные типы отсутствуют. Для большего понимания это объявление можно переписать следующим образом в C++:

typedef spis * T;
void function(T &h );

то есть параметр h - это ссылка.

Чтобы передать объект в функцию по ссылке в C, нужно передавать его через указатель на объект.

То есть вышеприведенную функцию следует объявить следующим образом

void function(spis **h);

Такая функция будет рботать в C и в C++.

READ ALSO
Как сдвинуть все элементы массива влево на 2?

Как сдвинуть все элементы массива влево на 2?

У меня такая проблема: мне нужно сдвинуть все элементы массива влево на 2То есть если начальный массив {1, 2, 3, 4, 5}, то должно получиться {3, 4, 5, 1, 2}

167
Как мне заполнить массив?

Как мне заполнить массив?

Как мне заполнить массив вводом с клавиатуры через цикл, чтобы при присваивании элементам массива значений и при нажатии Enter курсор не перебегал...

147
WinInet, 301 редирект и отличия в версиях

WinInet, 301 редирект и отличия в версиях

Подскажите пожалуйста, есть функция для GET запроса через WinInetОна отлично отрабатывает на Win10 (мой домашний ПК) и на Win7 (один из серверов)

132
Создание копии на указатель

Создание копии на указатель

Как можно скопировать из указателя на int в новую переменную, пытаюсь

146