Ошибка сегментации в C, не могу понять, почему - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть функция, которая должна (очень плохо) читать файл.Я ожидаю, что он изменит структуру, которую я передаю в качестве параметра для хранения вещей, которые он должен прочитать.Но когда я это называю, это вызывает ошибку сегментации.У меня есть печать как первое, что делает функция, а она этого не делает.Так что, я думаю, у меня проблема с объявлением функции или чего-то еще.Я не могу понять.

int main(int argc, char **argv){
    //some parser here
    struct client_config *config;
    read_software_config_file(*config); //I also passed it as non pointer and & but nothing worked.
    } 

void read_software_config_file(struct client_config config){
    printf("Hello"); //it breaks here
  }

Как кто-то указал, я сделал это:

 struct client_config config;
 read_software_config_file(&config);

Но это все еще показывает мне ошибку сегментации.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

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

Если вы используете оператор разыменования * для неинициализированного указателя, вы разыменовываете любой адрес, представленный текущим значением указателя, что является неопределенным поведением, и почтиконечно, вызовет нарушение прав доступа.

Вам нужно инициализировать указатель, чтобы указать на что-то;либо существующая struct client_config, либо новая память кучи, выделенная с помощью malloc или calloc.

Кроме того, если ваша функция действительно должна принимать указатель на struct client_config, параметр должен иметь* оператор также.

0 голосов
/ 15 февраля 2019

Вот рабочий пример:

#include <stdio.h>

struct client_config
{
    int data;
};

void read_software_config_file(struct client_config *config); // Forward Declaration

int main(int argc, char **argv)
{
    struct client_config config; // Memory on stack. Use malloc/calloc for heap
    config.data = 10; // Init data
    read_software_config_file(&config);
    printf("config.data = %d\n", config.data);

    return 0;
}

void read_software_config_file(struct client_config *config)
{
    printf("Hello\n");
    config->data = 12;
}

Обычно я бы посоветовал скомпилировать с -Wall -Wextra -pedantic для раннего обнаружения ошибок.

Вы должны переслать объявление функции read_software_config_file (или включите заголовок и т. д.) компилятор знает подпись, когда вы вызываете ее в main.

Как сказано в комментариях, вы должны взять указатель на структуру, st она может быть изменена.

Выход после запуска main:

Hello
config.data = 12
...