C 多文件直接编译正常,直接编译错误

C 多文件直接编译正常,直接编译错误,c,makefile,segmentation-fault,core,C,Makefile,Segmentation Fault,Core,有3个文件(generator.c、generator.h和main.c) generator.c:只有一个函数(gen-fun),用于生成一个数组以在generator.c中存储10个随机生成的数字 生成器.h:生成器的声明.c main.c:main.c中只有一个函数(main fun),用于打印以前生成的数字 如果generator.c包含在main.c中,我直接通过执行“gcc main.c”来编译它。结果还可以 但是,当我使用“gcc-c generator.h,gcc-c main.

有3个文件(generator.c、generator.h和main.c)

generator.c:只有一个函数(gen-fun),用于生成一个数组以在generator.c中存储10个随机生成的数字

生成器.h:生成器的声明.c

main.c:main.c中只有一个函数(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);”语句中报告了一个警告“警告:赋值从整数生成指针而不进行强制转换”。最终结果是“分段故障(岩芯倾倒)”。调试信息显示,如果我尝试访问主函数while循环中指针*p的值(即数组[0]),则“无法访问地址处的内存”

//////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;
}
///generator.c///////
整数*整数(整数arr[]
{
int i=0;
int*p=arr;
int len=10;
srand((未签名)((时间)(空));
而(我
根据您问题的补充,您似乎对如何包含
generator.h
然后编译代码感到困惑。首先,您的
生成器.h
应该是:

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

int *gen (int arr[]);

#endif
编辑:添加了适当的标题保护,以防止多个
生成器.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;
}
编译

$ 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

仔细检查一下,如果你还有其他问题,请告诉我。

第二次我看到
*p=rand()%(len+1)+0--你确定吗--你不是指
*p=rand()%len+1??(在
1之间生成随机数)但是当我使用“gcc-c
generator.h
”编译它时——不要在编译字符串中包含
generator.h
。..@DavidC.Rankin实际上,这是我第二次提交这个问题,因为代码之前包含一些错误…我已经看到代码示例为“int num=(rand)”()%(上限-下限+1))+lower”。至于代码,我不明白为什么没有编译错误,只有一个最终输出错误。是的,这是一个范围+偏移量,这个范围不是从零开始的。
rand()%(limit+1)
(给出
0@DavidC.Rankin的范围谢谢你的及时回复!多文件编译真的让我很困惑。编译过程非常简单,而所有函数都在一个文件中。但是我正在尝试练习如何编写makefile来编译C的多个文件。很明显,我是C语言的新手,如果你能推荐的话一些C语言学习的书籍,对我很有帮助。这是一个很好的答案,除了一些细节。特别是不要在头文件中包含头文件,除非该头文件的内容需要它们。文件
生成器.h
不需要
\include
也不需要
\include
还有对
srand()的调用
只应执行一次,通常在函数的顶部:
main()
这些都是好的点。我们可以将它们转移到需要它们的源代码中。(最初的答案是展示如何编译提问者所拥有的内容)适当时的重新排列并不是它们被卡住的地方。
$ ./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