Ошибка в конце программы после выполнения всего? - PullRequest
0 голосов
/ 08 апреля 2010

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

struct foo
{
    int cat;
    int * dog;
};

void bar (void * arg)
{
    printf("o hello bar\n");
    struct foo * food = (struct foo *) arg;
    printf("cat meows %i\n", food->cat);
    printf("dog barks %i\n", *(food->dog));
}
void main()
{
    int cat = 4;
    int * dog;
    dog = &cat;

    printf("cat meows %i\n", cat);
    printf("dog barks %i\n", *dog);

    struct foo * food;
    food->cat = cat;
    food->dog = dog;

    printf("cat meows %i\n", food->cat);
    printf("dog barks %i\n", *(food->dog));

    printf("time for foo!\n");
    bar(food);
    printf("begone!\n");

    cat = 5;
    printf("cat meows %i\n", cat);
    printf("dog barks %i\n", *dog);

//  return 0;
}

, которая дает результат

cat meows 4
dog barks 4
cat meows 4
dog barks 4
time for foo!
o hello bar
cat meows 4
dog barks 4
begone!
cat meows 5
dog barks 5
Segmentation fault (core dumped)

Я не совсем уверен, почемуСег ошибки в конце?Любые комментарии / идеи высоко ценятся.

Ответы [ 4 ]

5 голосов
/ 08 апреля 2010

Вы разыменовываете указатель на недопустимую память, food.

Строка:

struct foo * food;

объявляет food как указатель на struct foo.Но так как вы не инициализируете указатель, он указывает на неопределенную область памяти, которой вы не владеете.Вы можете просто выделить в стеке (заметьте, я изменил тип еды):

struct foo food;
food.cat = cat;
food.dog = dog;

printf("cat meows %i\n", food.cat);
printf("dog barks %i\n", *(food.dog));

printf("time for foo!\n");
bar(&food);

или использовать malloc (сохраняя тип как struct foo *):

struct foo * food = malloc(sizeof(struct foo));
if(food == NULL)
  perror("Failed to allocate food.");

Позже вы должны освободить его (хотя в этом случае это не имеет большого значения):

free(food);

Есть другие проблемы с программой (например, параметр void *), но это касается памятинарушение.

1 голос
/ 08 апреля 2010

Вы не выделили пространство для структурной переменной, на которую будет указывать переменная food:

struct foo * food;

Вам необходимо сделать:

struct foo * food = (struct foo*) malloc(sizeof(struct foo));

также вы должны быть освобожденыкак только вы закончите использовать эту память:

free(food);

В качестве альтернативы вы можете объявить food как переменную типа struct foo как:

struct foo food; // note the missing *

и затем получить доступ к элементам структуры.используя оператор . вместо оператора ->.Так

food->cat = cat;

Меняется на

food.cat = cat;
1 голос
/ 08 апреля 2010

Ну, эти строки - проблема:

struct foo * food;
food->cat = cat;
food->dog = dog;

Еда - это указатель, который вы разыменовываете без указания чего-либо.

struct foo food;
food.cat = cat;
food.dog = dog;

может исправить все для вас.

0 голосов
/ 08 апреля 2010

Вы получаете неопределенное поведение, потому что вы не испортили структуру питания.

...