2016-05-11 3 views
1

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

У меня есть этот кусок кода:

struct point { 
    int x; 
    int y; 
} *ptr; 

ptr->x = 8; 
ptr->y = 8; 

Запуск этого дает ошибку сегментации. То, что я хочу сделать, это присвоить значение 8 x/y, к которому, насколько я понимаю, указывает ptr.

+2

Адрес, на который указывает 'ptr'?(ключ: отсутствует выделение памяти) –

+2

@ForceBru 'malloc (1)' явно ошибочно, должно быть 'sizeof (struct point)'. – fluter

+0

@fluter или, если на то пошло, 'ptr = malloc (sizeof * ptr);' –

ответ

0

Пусть я объясню вам простой способ.

1.

Переменные содержат данные (значения, хотят их держать) и указатели держать только адреса памяти переменных (которые только часть памяти). Указатели используются, чтобы просто удерживать адрес переменных, чтобы они не могли хранить какие-либо пользовательские данные. Мы можем хотя бы создать указатель на переменную и манипулировать этой переменной с помощью конкретного указателя. Сначала нам нужно создать переменную, затем мы создаем указатель, который ссылается на эту переменную, тогда мы делаем что-либо с указателем, и переменная будет манипулировать.

struct point 
{ 
    int x; 
    int y; 
}; 
struct point var1;  //declare a variable 
struct point *ptr=&var1;// declare a pointer to that variable 
ptr->x = 8;    // manipulate the variable 
ptr->y = 8; 

Или

2.

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

struct point 
{ 
    int x; 
    int y; 
} *ptr; 

ptr=(struct point*)malloc(sizeof(struct point)); // this will allocate memory required to hold your structure    
ptr->x = 8;  //manipulate the memory content pointed by your pointer.  
ptr->y = 8; 
4

Ваш ptr является Указатель на struct point.

Однако нет struct point Указывает на.

struct point { 
    int x; 
    int y; 
} *ptr; 

struct point pt; // add this... 

ptr = &pt;  // ...and this. 

ptr->x = 8; 
ptr->y = 8; 
2

Вы создали указатель, называемый ptr, но не инициализируется его. Когда вы разыскиваете его с помощью ptr-> (или), вы вызываете неопределенное поведение, которое в вашем случае приводит к сбою программы (но может сделать что угодно).

Это было бы лучше:

struct point { 
    int x; 
    int y; 
}; 
struct point sp = {0,0}; 
struct point *ptr = &sp; 

sp.x = 8; 
ptr->y = 8; 
1

Проблема заключается в том, что указатель ptr не указывает на какой-либо действительный буфер памяти, присвоить его выделяемой или автоматического хранения вместо:

// way 1 
struct point p; 
ptr = &p; 
ptr->x = 8; 
ptr->y = 8; 

// way 2 
ptr = malloc(sizeof *ptr); 
ptr->x = 8; 
ptr->y = 8; 
// when you are done remember to release the allocated memory 
free(ptr); 
0

Необходимо присвоить действительную ячейку памяти ptr, которая является указателем на структурную точку. Вы можете использовать malloc или объявить переменную с struct point и присвоить свой адрес ptr (как и вышеупомянутые ответы).

Btw, если ptr имеет область видимости файла, то он инициализируется нулем, то есть указателем NULL; в противном случае оценка ptr - это неопределенное поведение (вы можете получить любое значение). В обоих случаях попытка разыменования ptr является неопределенным поведением и, следовательно, вы можете получить segfault (в какой-то реализации вы могли бы случайно изменить некоторое место памяти).

Смежные вопросы