2012-05-11 3 views
2

У меня возникает ошибка сегментации при запуске prog.c. Я обнаружил, что это что-то с моим * char. Вот код.Ошибка сегментации на char

prog.c

#include <stdio.h> 
#include "worker.h" 
#include "manager.h" 
#include "employee.h" 

int main(int argc, char **argv) { 
    int i; 
    Worker boss = (Worker) new_Manager("Carl Cracker", 80000, 1987, 12, 15); 
    return 0;  
} 

worker.h

#ifndef _WORKER_H_ 
#define _WORKER_H_ 

#define WORKER char *name; \ 
      double salary; \ 
      long hireDay; \ 
      void (*raiseSalary)(Worker this, double byPercent); 

typedef struct Worker_struct* Worker; 
struct Worker_struct { 
    WORKER; 
} Worker_struct; 

void raiseSalary(Worker this, double byPercent); 

#endif 

worker.c

#include <stdio.h> 
#include <stdlib.h> 

#include "worker.h" 

void raiseSalary(Worker this, double byPercent) { 
    Worker worker = (Worker) this; 
    printf("worker_c: raising salary\n"); 
    double raise = worker->salary * byPercent/100; 
    worker->salary = worker->salary + raise; 
} 

manager.h

#ifndef _MANAGER_H_ 
#define _MANAGER_H_ 

#include "worker.h" 


typedef struct Manager_struct* Manager; 
struct Manager_struct { 
    WORKER; 
    double bonus; 
void (*setBonus)(Worker this, double b); 
} Manager_struct; 

Manager new_Manager(char *name, double salary, int year, int month, int day); 
#endif 

manager.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <malloc.h> 
#include "manager.h" 

static void setBonus(Worker this, double b) { 
    Manager manager = (Manager) this; 
    manager->bonus = b; 
} 

Manager new_Manager (char *name, double salary, int year, int month, int day) { 
    Manager manager; 
    strcpy (manager->name, name);//----i think my problem is here---- 
manager->salary = salary; 
manager->bonus = 0;  
manager->setBonus = setBonus; 
manager->raiseSalary = raiseSalary; 

return manager; 
} 

Я думаю, что моя проблема заключается в manager.c в зЬгсру. Что я делаю не так?

ответ

2

Вы указали char *name в макросе WORKER, но память ему не была выделена.

Пожалуйста, не указывайте переменные в макросах, подобных этому; нет никакой выгоды, и это усложняет код без необходимости. Просто определите их непосредственно в Worker_struct.

+0

Я переехал все из РАБОТНИКА и в Worker_struct и Manager_struct, но я получаю ту же ошибку Сегментация – user821863

+0

@ user821863 также вы не выделенной памяти для 'manager' в' newManager' – keety

+0

Я добавил «таНос (STRLEN (имя + 1)); но такая же ошибка – user821863

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