【问题标题】:"error: conflicting types" when trying to return a character-array reference [duplicate]尝试返回字符数组引用时出现“错误:类型冲突”[重复]
【发布时间】: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 的警告。如果没有,您应该调高警告级别。
  • 您应该将所有包含“隐式声明”的警告视为错误。

标签: c string return


【解决方案1】:
  1. 在调用之前需要函数原型。
  2. 如果函数不带参数声明为char* randip(void)
  3. 使用正确的main 签名。在这种情况下int main(void)
int randint(unsigned int min, unsigned int max);
char* randip(void);

int main(void)
{
     /* ...*/
}

char* randip(void)
{
     /* ...*/
}

// generate rand int
int randint(unsigned int min, unsigned int max)
{
     /* ...*/
}

【讨论】:

    猜你喜欢
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多