прямая компиляция нескольких файлов, ошибка прямой компиляции - PullRequest
2 голосов
/ 17 октября 2019

Есть 3 файла (generator.c, generator.h и main.c).

generator.c: есть только 1 функция (gen fun), которая используется для генерации массива для хранения 10случайное генерирование чисел в generator.c.

generator.h: объявление generator.c.

main.c: в main.c есть только 1 функция (main fun), котораяиспользуется для печати сгенерированного ранее числа.

Если generator.c включен в main.c, и я скомпилирую его напрямую, выполнив "gcc main.c". Результат в порядке.

Но пока я компилирую его, используя " gcc -c generator.h, gcc -c main.c, gcc generator.o main.o ", он сообщилпредупреждение " предупреждение: присваивание делает указатель из целого числа без приведения " в " p = gen (arr) ;" предложение в основной функции. И конечный результат был «Ошибка сегментации (ядро сброшено)». Отладочная информация показала « Невозможно получить доступ к памяти по адресу », если я попытаюсь посетить значение указателя * p (т.е. массив [0]) в цикле while основной функции.

//////generator.c///////
int *  gen( int arr[])
{
    int i = 0;
    int * p = arr;
    int len = 10;
    srand( (unsigned)((time)(NULL)));
    while (i< len)
    {
        *p = rand() % ( len  +1) + 0;
        i ++;
        p++;
    }
    return arr;
}

//////generator.h//////
int * gen( int arr[]);

//////main.c///////
int main(void)
{
    int i = 0;
    int arr[10]={0};
    int * p;
    p = gen(arr);

    while (i < 10)
    {
        printf("output is %d\n",*p);// Segmentation fault (core dumped)
        i++;
        p++;
    }
    return 0;
}

1 Ответ

0 голосов
/ 17 октября 2019

Судя по добавлению к вашему вопросу, вы не понимаете, как включить generator.h и затем скомпилировать код. Сначала ваш generator.h должен быть:

//////generator.h//////
#ifndef GENERATOR_H
#define GENERATOR_H  1

int *gen (int arr[]);

#endif

( edit: добавлено соответствующее Защита заголовка для предотвращения многократного включения generator.h)

Ваш generator.c будет тогда:

//////generator.c///////
#include <stdlib.h>

#include "generator.h"

int *gen (int arr[])
{
    int i = 0;
    int * p = arr;
    int len = 10;

    while (i< len)
    {
        *p = rand() % len + 1;
        i ++;
        p++;
    }

    return arr;
}

И, наконец, ваш main.c (я назвал это gen.c) будет:

//////main.c///////
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "generator.h"

int main(void)
{
    int i = 0;
    int arr[10]={0};
    int *p;

    srand( (unsigned)((time)(NULL)));

    p = gen(arr);

    while (i < 10)
    {
        printf ("output is %d\n",*p);
        i++;
        p++;
    }
    return 0;
}

Компиляция

$ gcc -Wall -Wextra -pedantic -std=c11 -Ofast generator.c -o bin/gen gen.c

( примечание: Я также рекомендовал бы добавить -Wshadow в качестве нормальной части вашей строки компиляции, а также для идентификации любых теневых переменных)

Пример Использование / Вывод

$ ./bin/gen
output is 8
output is 1
output is 5
output is 4
output is 9
output is 5
output is 4
output is 6
output is 5
output is 6

Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...