2016-08-26 3 views
0

Если есть структура, как показано ниже:памяти для структуры указателя

struct student { 
    int id; 
    int marks; 
} *S1,S2; 

Почему требуется выделить память * S1, но не S2? Когда * S1 объявлен как указатель структуры, нет ли выделенной памяти? Является ли выделение памяти только при явном распределении?

+3

Кто сказал, что что-то требуется? –

+2

Память * * автоматически выделяется для S1. Достаточно достаточно памяти для представления указателя. Вы можете указать, что где угодно, даже нераспределенная память, это будет действительный указатель, указывающий на недопустимый 'struct student'. – Tibrogargan

+0

Память для самого указателя выделяется, но пока вы не выделите «ученик» и не назначьте указатель указать местоположение этой памяти, указатель будет указывать на мусор, если он не инициализирован. S2 выделяется так же, как указатель S1; но один - «ученик», а один - указатель.Память самого указателя и то, на что он указывает, - совершенно разные вещи. –

ответ

1

Ну, это как работает язык. Он автоматически резервирует память для типа, который вы запрашиваете. Если вы запрашиваете struct student, он резервирует память для struct student. Если вы запрашиваете pointer, он резервирует память для pointer.

Пример с int:

int n; // Reserves memory for an int 
int *p; // Reserves memory for a pointer (that points to an int) 
     // but there is no memory allocated to hold the int 
     // p needs to be initialized before you dereference it (i.e. *p) 

p = malloc(sizeof(int)); // Initialize p and allocate memory to hold the int 
if (!p) exit(1);   // Error - no memory available 

*p = 5; // Now p can be used 

free(p); // Release the memory 

Ваш случай не отличается от приведенного выше примера. S2 - это struct student, а S1 - указатель (до struct student), и вам нужно инициализировать S1, выделив память для struct student. Нравится:

S1 = malloc(sizeof(struct student)); 
3

В C каждая переменная является местом памяти. В вашем примере оба S1 и S2 являются переменными, но S1 является указателем. Указатель - это переменная, которая по назначению предназначена для хранения адреса ячейки памяти.

В вашем примере S2 является нормальной переменной типа struct student указывает на ячейку памяти, размер которой равен sizeof(struct student). S1, являющийся переменной указателя, указывает на ячейку памяти, размер которой эквивалентен размеру указательной переменной (4 байта для 32-битных систем и 8 байтов для 64-битных систем обычно).

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

+0

Означает ли это, что S1 и S2 занимают разный размер памяти при объявлении? –

0

Каждая переменная связана с некоторым хранилищем (по крайней мере, на C). Так что это для S1 и S2. Но S1 является указателем, поэтому требуется хранение указателя на структуру, S2 - это структура, в которой выделяется хранилище для полной структуры. Разница заключается в том, что S1 является косвенным, означает, что его хранилище не содержит структуру, а адрес структуры, если вы хотите, чтобы она была привязана к структуре, вам необходимо предоставить ему соответствующий адрес. Либо:

S1 = &S2; 

где & оператор, взявшие адрес S2. Теперь S1 является ссылкой на S2. Или:

S1 = malloc(sizeof(struct student)); 

где malloc (динамически) выделяет память для структуры и возвращает его адрес (в случае успеха).