【发布时间】:2021-10-05 19:12:33
【问题描述】:
为了学习 C 和字符串操作,我正在制作一个小程序,它可以简单地将随机 IP 地址生成为字符串并输出。根据我从各种教程以及 stackoverflow 上的示例中收集到的信息,以下是这样做的一种方法,但返回字符数组引用让我很困惑,因为它无法编译:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *testip = randip();
printf("%s", testip);
free(testip);
return 0;
}
// get rand IP
char* randip()
{
char *ip = malloc(16);
int a = randint(1,254);
int b = randint(0,254);
int c = randint(0,254);
int d = randint(0,254);
sprintf(ip, "%d.%d.%d.%d", a, b, c, d);
printf("D> randip generated %s", ip);
return ip;
}
// generate rand int
int randint(unsigned int min, unsigned int max)
{
double scaled = (double)rand()/RAND_MAX;
return (max - min +1)*scaled + min;
}
gcc 输出:
test.c: In function ‘main’:
test.c:8:18: warning: initialization makes pointer from integer without a cast [enabled by default]
test.c: At top level:
test.c:17:7: error: conflicting types for ‘randip’
test.c:8:18: note: previous implicit declaration of ‘randip’ was here
我看不到哪些类型不兼容?我是否不小心返回、调用或误投了我不打算使用的类型?
注意:是的,我知道我的随机性不是很随机,并且可能有更好的方法来处理这部分,但这超出了本问题的范围。
【问题讨论】:
-
你需要在调用函数之前声明它们。或者在调用之前将定义向上移动。
-
@kalyum 移动函数定义来修复它,谢谢。我猜
previous implicit declaration of ‘randip’ was here是暗示该函数未声明? -
您的编译器还应该发出一些关于隐式声明
randip的警告。如果没有,您应该调高警告级别。 -
您应该将所有包含“隐式声明”的警告视为错误。