Ошибка сегментации C для начинающих

#c #segmentation-fault

#c #ошибка сегментации

Вопрос:

Я читаю эту книгу под названием «C Как программировать» от Deitel, и я все еще новичок в этом. Я знаю Java, поэтому я пытаюсь ознакомиться с синтаксисом C и тем, как он работает.

Мой код выглядит следующим образом:

файл>> gradebook_interface.h

 #include <string>
//#include <unordered_map>
using namespace std;

//specifing interface

class gradebook_interface
{
    public:
        //constructor
        gradebook_interface(string);
        void reset_Coursename();
        void setCoursename(string);
        string getCourseName();
        void displayMessage();
        void add_to_hashmap(string,int);

    private:
        //hashmap init
        //unordered_map <string, int> course_map;
        string courseName;
};
  

файл >> gradebook_interface.cpp

 #include <iostream>
//including interface "gradeinterface"
#include "gradebook_interface.h"

using namespace std;

    //constructor from interface
    gradebook_interface::gradebook_interface(string name)
    {
        setCoursename(name);
    }

    void gradebook_interface::setCoursename ( string name )
    {
        courseName = name;
    }

    string gradebook_interface::getCourseName()
    {
        return courseName;
    }

    void gradebook_interface::displayMessage()
    {
        cout << "First C   applicationn" << getCourseName() << "!" << endl;
    }

    //interfac's methods
    void gradebook_interface::reset_Coursename()
    {   
        courseName = "null";
        cout << "The course name has been reseted! Value is: " << getCourseName() << endl;
    }

    void gradebook_interface::add_to_hashmap(string, int)
    {
        //course_map["test_course"] = 14;
        //cout << "Hashmap value just entered:" << endl;
        //cout << course_map["test_course"] << endl;

    } 
  

файл >> gradebook_main.cpp

 #include <iostream>
#include "gradebook_interface.h"

using namespace std;

int main()
{
    gradebook_interface gradebook_1 ("Maths");
    gradebook_interface gradebook_2 ("Greek");

    cout << "gradebook 1 " << gradebook_1.getCourseName() << endl;
    cout << "gradebook 2 " << gradebook_2.getCourseName()  << endl;

};
  

В книге используется Visual Studio, которую я не могу использовать, потому что я на ubuntu.
Я где-то читал, что если вы компилируете код C с использованием «gcc», он автоматически вызывает «g «.
Но я получаю сообщение об ошибке, поэтому я вынужден использовать g .
Мой первый вопрос: могу ли я использовать gcc (какие-либо необходимые параметры?)?
Мой второй вопрос: как работает компоновщик?
Мой третий вопрос: почему я получаю ошибку сегментации при попытке запустить это??

Спасибо

Комментарии:

1. 1) gcc предназначен для кода c, g — для кода c . 2) Компилятор превращает исходный код в объектный код, а компоновщик связывает объектный код с исполняемым. 3) Пожалуйста, опубликуйте свою ошибку сегментации.

2. Похоже, вы страдаете от множества несвязанных проблем. Может быть, лучше всего сортировать их по одному. Вы действительно получаете segfault? Код выглядит нормально. Убедитесь, что вы компилируете правильно…

3. Какие ошибки вы получаете, и как выглядит трассировка стека, когда вы получаете segfault? На первый взгляд код выглядит нормально.

4. Это я, или фактические вопросы не имеют никакого отношения к названию?

5. Скорее побочный комментарий, но добавьте несколько защитных включений в ваш файл H 🙂 #ifndef/#define / #endif, и я не понимаю, как это может привести к ошибке сегментации, можем ли мы увидеть вашу ошибку?

Ответ №1:

У меня нет проблем с компиляцией вашей программы таким образом:

 g   -O2 -g main.cpp gradebook_interface.cpp -o main
  

На самом деле я использовал следующее Makefile

 all: main

main: main.cpp gradebook_interface.cpp
    g   -O2 -g $^ -o $@
  

и простой выданный make amp;amp; ./main вывод:

 gradebook 1 Maths
gradebook 2 Greek
  

Я запустил его под valgrind; пока не обнаружено ошибок памяти. Я не смотрел ваш код

Редактирование How does the linker work части:

Если вы переписали этот Makefile следующим образом:

 all: main

CPPFLAGS =-O2 -g

main: main.o gradebook_interface.o
    g   $(CPPFLAGS) $^ -o $@
  

Это приведет к следующим шагам сборки:

 g    -O2 -g  -c -o main.o main.cpp
g    -O2 -g  -c -o gradebook_interface.o gradebook_interface.cpp
g   -O2 -g main.o gradebook_interface.o -o main
  

в котором показано, как выполнять шаги компиляции ( -c ) отдельно от шага ссылки. В этом случае шаг связывания может быть записан как явный вызов ld intead, но вам придется самостоятельно указать библиотеки времени выполнения для libgcc и libstdc