【问题标题】:return makes integer from pointer without a cast [-Wint-conversion] return candidatereturn 从没有强制转换的指针中生成整数 [-Wint-conversion] 返回候选
【发布时间】:2016-05-04 20:12:31
【问题描述】:

我正在学习 C,但我发现那些模糊的编译器错误消息越来越令人沮丧。这是我的代码:

char getkey (int minimo, int maximo, int alphalen, int index, char alpha[])  
{  
    int cociente, residuo, cont;
    int i = 0;
    char cand[maximo+1];
    char candidate[maximo+1];

    while (index != 0)
    {
        cociente = index / alphalen;
        residuo = index%alphalen;
        cand[i] = residuo;
        index = cociente;
        i+=1;
    }

    for (cont=i-1; cont>=0; cont--)  
    {   
        int pos = cand [cont];
        candidate[i] = alpha[pos];      
    }
    return candidate;
}

这会产生一个警告:

  • return 从没有强制转换的指针中生成整数
    • 返回候选人;

有人可以解释这些警告吗?

【问题讨论】:

  • 您的函数希望返回 char,但您返回的是 char 吗?
  • 候选人不是字符
  • 您的函数被声明为返回char,但您正试图返回char *
  • candidate 是一个 char 数组,而不是一个 char,并且声明了您的函数,因此返回值应该是一个 char。

标签: c


【解决方案1】:

您的局部变量candidate 是一个字符数组。当你说

return candidate;

你返回一个指向 char 的指针。 (这是由于 C 中的数组和指针之间的关系非常密切,如果您还不知道,则必须了解这一点。)但是您已经声明您的函数 getkey 返回一个字符,而不是指针-to-char。

您需要使函数的返回值与其类型匹配。您可能想要更改 return 语句,使其返回单个字符。如果您想让函数返回一个完整的字符串,您可以将其声明更改为char *getkey(),但在这种情况下,您还必须注意candidate 数组的分配。

以下是警告的含义。你试图返回一个指针。该函数应该返回一个字符,该字符表示为一个小整数。编译器愿意尝试将指针转换为整数,以防这是您真正想要做的,但由于这通常不是一个好主意,它会警告您。实际上,在这种情况下,警告会告诉您您可能犯了一个错误。

【讨论】:

  • 真的被称为“C 中的数组和指针等价”吗?因为那不是真的。数组可以在某些上下文(即传递和返回)下衰减为指针,但它们不是指针。
  • @Kevin "Equivalence" 是我们过去所说的。 (没有人再使用这个词了吗?)“等价”并不意味着它们是同一个东西。只是他们密切 - 甚至密切 - 相关。见c-faq.com/aryptr/aryptrequiv.html
  • 不,数组和指针不是密切相关的。一个是内存地址,另一个是在内存中连续布局的 n 个元素。
  • @tuple_cat “如果数组和指针不是密切相关”,user5672720 问道,“那么当我试图从我的函数返回一个数组时,为什么它会返回一个指针呢?”
  • @Adam 谢谢,在这种情况下没有考虑到这一点。又修改了一些。
【解决方案2】:

getkey 已声明返回 char,但您正试图返回 candidate,它是一个 char 数组。

您可能打算返回数组中的一个元素,例如 candidate[x]

错误消息显示“指针”而不是“数组”的原因是编译器将candidate 转换为指向数组中第一个元素的指针,这在某些上下文中隐式发生,例如在返回时,因为数组不能在 C 中按值返回(或作为参数传递)(参见What is array decaying?)。

【讨论】:

    猜你喜欢
    • 2019-02-16
    • 2016-05-29
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    相关资源
    最近更新 更多