在为局部变量赋值参数时,从不兼容的指针类型进行赋值

时间:2014-01-12 19:44:46

标签: c function pointers typedef

下面的代码会返回一条警告消息,我无法理解为什么,也无法在有关同一警告消息的问题中找到答案。我将感谢您获取正确的代码和有关警告信息的说明。

警告是:

  

警告:从不兼容的指针类型

进行分配

代码是:

#include <stdio.h>

typedef struct sum {
    int a,b,c;
} mytype;

mytype  sum_operation, *ptr;    


mytype sum(sum_operation) {

    ptr = &sum_operation;  

    (*ptr).a = 1;       
    (*ptr).b = 3;       

    (*ptr).c =(*ptr).b + (*ptr).a  ;

    printf("%d\n",(*ptr).c);

}

int main(){

    sum(sum_operation);
    return 0;

}

3 个答案:

答案 0 :(得分:3)

mytype sum(sum_operation) {

sum_operation的类型在哪里?

它可能默认为int。 (有理由看到@Gilles的评论和@ AndreyT的回答)。当然这会导致与

发生冲突
ptr = &sum_operation;  

希望sum_operation属于mytype类型。所以写:

mytype sum(mytype sum_operation) {

此外,您的函数没有return语句,但声明它返回mytype

答案 1 :(得分:3)

函数声明应该是(你省略了参数类型):

mytype sum(mytype sum_operation) {

答案 2 :(得分:2)

您的sum函数是使用旧式K&amp; R声明声明的。即你声明了一个参数sum_operation而没有指定它的类型。前C99编译器接受此声明,隐式将您的参数视为类型int。这就是导致“不兼容类型”问题的原因。

看起来您希望您的参数具有mytype类型。在这种情况下,您必须明确告诉编译器。使用具有显式指定参数类型

的现代原型样式函数声明
mytype sum(mytype sum_operation)
{

或者,如果你坚持旧式声明,请在函数头和第一个{之间指定参数类型

mytype sum(sum_operation)
mytype sum_operation;
{

这两种风格在现代C中仍然合法,前者远远优于后者。您的原始声明在现代C中是非法的,这意味着将编译器配置为在早期阶段正确捕获此类错误可能是个好主意。