Member 11627290 Ответов: 2

Моя программа на языке Си не компилируется или дает ошибку сегментации


Hi all I am trying to make a sample queue program. I just started with this concept and I am seeing a problem

    #include <stdio.h>
    #include <stdlib.h>
    struct node {
    	int data;
    	struct node *next;
    };
    
    struct queue{
    	struct node *front;
    	struct node *rear;
    };
    
    struct queue *q=NULL;//pointer is initialised
    q->front = NULL;//pointer members are initialised
    q->rear = NULL;//initialised
    
    
    
    int main(void)
    {
    struct node *ptr = NULL;

    /*q->front = NULL;
    q->rear = NULL;*/
    
    ptr = (struct node *)malloc(sizeof(struct node));
    if(ptr == NULL)
    {
    	printf("error allocationg memory\n");
    	return 1;
    }
    ptr->next = NULL;
    ptr->data = 10;
    if(q->front == NULL)
    	{
    		q->front = ptr;
    		q->rear = ptr;
            //rest of the logic
       	}
    free(ptr);
    return 0;
    }

I am getting two problems,

1)If I create 

    q->front = NULL;
    q->rear = NULL;

as global I get this warning

    error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token
     q->front = NULL;
      ^
    queue.c:15:2: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token
     q->rear = NULL;

2) If I create same variables inside main, I can compile, but at runtime I am getting segmentation fault.
Why is this happening?
my setup is **gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)** 
maybe this is a stupid question.


Что я уже пробовал:

Я не в состоянии понять, что даже я инициализирую переменные в NULL, это дает мне ошибки компиляции.
Как понять эту проблему и решить ее?

2 Ответов

Рейтинг:
0

Patrice T

Цитата:
Моя программа на языке Си не компилируется или дает ошибку сегментации

Вам нужно выбрать, дает ли программа ошибку компиляции или дает ошибку сегментации, но не то и другое.

Тебе нужно учиться
- Динамическое выделение памяти (alloc или malloc)
- указатели
- Использование ->

Цитата:
struct queue *q=NULL;//pointer is initialised

Нет, он не инициализирован, и вы не можете присваивать значения членам.

Вот ссылки на справочники книг по Си от авторов этого языка.
Язык программирования Си - Википедия, свободная энциклопедия[^]
https://hassanolity.files.wordpress.com/2013/11/the_c_programming_language_2.pdf[^]
http://www.ime.usp.br/~ПФ/Керниган-Ритчи/с-Программирование-электронные книги.формат PDF[^]


Рейтинг:
0

Jochen Arndt

1)

q->front = NULL;//pointer members are initialised
q->rear = NULL;//initialised
Это инструкции. Инструкции должны быть помещены в функции. При использовании таких внешних функций возникает ошибка. Единственным исключением является инициализация переменной при объявлении как в
struct queue *q=NULL;


2)
Ваш q указатель инициализируется с помощью NULL но это не указывает на действительный struct queue объект. Так
q->front = NULL;
попытается записать нулевое значение в нулевой адрес, что приведет к ошибке сегментации.


Вы должны создать struct queue сначала объект и пусть q смысл в том, что:
/* Base structure initialised with NULL pointers */
struct queue base = { NULL, NULL };
/* Pointer to the base structure */
struct queue *q = &base;
Вышеизложенное решает обе проблемы:
Он объявляет две глобальные переменные и инициализирует их, но не использует никаких инструкций.