gpt4 book ai didi

c - 多文件直接编译ok,直接编译报错

转载 作者:太空狗 更新时间:2023-10-29 14:49:24 26 4
gpt4 key购买 nike

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

generator.c:在generator.c中只有1个函数(gen fun)用来生成一个数组来存放10个随机生成的数。

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);”主函数中的句子。最后的结果是“Segmentation fault (core dumped)”。如果我尝试在 main 函数的 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.h 然后编译代码感到困惑。首先你的 generator.h 应该是:

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

int *gen (int arr[]);

#endif

(编辑添加了适当的Header Guards以防止多次包含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

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

关于c - 多文件直接编译ok,直接编译报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58423983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com