C中的指针,异常行为

时间:2017-02-18 06:17:32

标签: c pointers

我正在尝试使用指针找到圆圈的面积和周长。正确的代码如下所示

#include<stdio.h>

void main(){
    int radius; 
    float area, peri;
    printf("Enter the radius of a circle: ");
    scanf("%d", &radius);
    areaperi(radius, &area, &peri);
    printf("Area is %f\nPerimeter is %f", area, peri);
}

areaperi(int r, float *a, float *b){
    *a = 3.14*r*r;
    *b = 2*3.14*r;
}

但是,如果我在声明并扫描半径并将r中的areaperi()更改为#include<stdio.h> void main(){ float radius; float area, peri; printf("Enter the radius of a circle: "); scanf("%f", &radius); areaperi(radius, &area, &peri); printf("Area is %f\nPerimeter is %f", area, peri); } areaperi(float r, float *a, float *b){ *a = 3.14*r*r; *b = 2*3.14*r; } 时将半径数据类型替换为float,则会给我一个错误。

DerefMut
  

[错误] areaperi的冲突类型

我使用Dev C ++。

我不明白为什么我的代码不适用于radius的浮动值。

3 个答案:

答案 0 :(得分:5)

根本不是异常行为;它是C标准所要求的。

在您调用areaperi()时,该函数的范围没有原型。因此,它被认为是一个返回int且其参数受默认促销约束的函数 - float转换为double且任何整数类型都短于int (因此shortchar)会提升为int

areaperi()的定义更改为:

areaperi(float r, float *a, float *b)

第一个参数的类型不再与推断类型一致,因此您会收到错误。

您的功能应在使用前声明。它没有返回值,因此应该使用返回类型void声明和定义它。另外,main() returns an int。回显输入和计算值是个好主意,特别是因为代码没有检查scanf()调用是否成功。

因此,您需要:

#include <stdio.h>

void areaperi(float r, float *a, float *b);

int main(void)
{
    float radius; 
    float area, peri;
    printf("Enter the radius of a circle: ");
    scanf("%f", &radius);
    areaperi(radius, &area, &peri);
    printf("Radius is %f\nArea is %f\nPerimeter is %f",
           radius, area, peri);
    return 0;
}

void areaperi(float r, float *a, float *b){
    *a = 3.14*r*r;
    *b = 2*3.14*r;
}

这些规则存在的原因是向后兼容性&#39;使用预先标准的C。

请注意,C99及更高版本要求在使用之前声明函数,并要求所有函数都具有显式返回类型。优良作法是确保声明实际上是原型。请注意,如果您在void areaperi();之前写了main(),它会声明该函数但提供原型 - 它表示areaperi()是一个返回no的函数value但是参数列表没有被描述,除了可变长度参数列表之外可以是任何东西(那些需要原型,原型最后有, ...))。

答案 1 :(得分:2)

forward declaration提供给areaperi()函数并添加void作为返回类型

#include<stdio.h>

void areaperi(float r, float *a, float *b);

void main(){
    float radius; 
    float area, peri;
    printf("Enter the radius of a circle: ");
    scanf("%f", &radius);
    areaperi(radius, &area, &peri);
    printf("Area is %f\nPerimeter is %f", area, peri);
}

void areaperi(float r, float *a, float *b){
    *a = 3.14*r*r;
    *b = 2*3.14*r;
}

答案 2 :(得分:2)

试试这段代码

#include<stdio.h>

void areaperi(float r, float *a, float *b);
void main()
{
    float radius;
    float area, peri;
    printf("Enter the radius of a circle: ");
    scanf("%f", &radius);
    areaperi(radius, &area, &peri);
    printf("Area is %f\nPerimeter is %f", area, peri);
}

void areaperi(float r, float *a, float *b){
    *a = 3.14*r*r;
    *b = 2*3.14*r;
}