指针不能正确打印值

时间:2017-12-30 21:42:18

标签: c arrays algorithm pointers minmax

我想问为什么我的代码不起作用我已经厌倦了很多事情无济于事由于一些特殊的原因,程序可以找到数组的最小值,但无法找到它的最小值并返回值0.000000。希望下面的代码有所帮助。

这就是我的主要功能。

int main(void){

    float array[5] = {12,32,56,67,54};

    float min;
    float max;

    float *ptrMin;
    float *ptrMax;

    ptrMin = &min;
    ptrMax = &max;

    findMinMax(array, ptrMin, ptrMax);

    printf("%f %f", *ptrMin, *ptrMax);

    system("pause");
    return 0;
}

我使用函数findMinMax将两个值返回给我的main函数。

void findMinMax(float *array, float *ptrMin, float *ptrMax){
    float ptrMinTemp;
    float ptrMaxTemp;

    *ptrMin = ptrMinTemp;
    *ptrMax = ptrMaxTemp;

    while(*array){
        if(*array < ptrMinTemp){
            ptrMinTemp = *array;
            *ptrMin = ptrMinTemp;
        }

        if(*array > ptrMaxTemp){
            ptrMaxTemp = *array;
            *ptrMax = ptrMaxTemp;
        }
        array++;
    }
}

在添加此评论之前,是的,我创建了原型函数,并且还包含了正确的头文件。

#include <stdio.h>
#include <stdlib.h>

void findMinMax(float *array, float *ptrMin, float *ptrMax);

在控制台中,我得到以下内容:

0.000000 67.000000Press any key to continue . . .

3 个答案:

答案 0 :(得分:6)

while(*array)

本质上是错误的,这意味着“当*数组为零时停止”,除非你在数组的末尾加上0以将其标记为数组的结尾,否则你不能这样做。

所以你必须发送数组的大小:

// ...
findMinMax(array, ptrMin, ptrMax, sizeof array / sizeof *array);

void findMinMax(float *array, float *ptrMin, float *ptrMax, size_t size)
// ...
for (size_t i = 0; i < size; i++) // use array[i] not *array in that loop

另外,您没有初始化minmax

float min = array[0];
float max = array[0];

答案 1 :(得分:4)

阵列没有等于0.0f的标记值。因此这个循环

while(*array){

没有意义。

此外还有变量

float ptrMinTemp;
float ptrMaxTemp;

未明确初始化并具有不确定的值。结果这些陈述

*ptrMin = ptrMinTemp;
*ptrMax = ptrMaxTemp;

导致未定义的行为。

考虑到函数findMinMax中的数组未更改。因此,应使用限定符const声明第一个参数。

通常,pointer可以指向一个空数组,因此函数应该有一些方法来表示这种特殊情况。

函数findMinMax可以通过以下方式定义

int findMinMax( const float *array, size_t n, float *ptrMin, float *ptrMax )
{
    int success = n != 0;

    if ( success )
    {
        *ptrMin = *array;
        *ptrMax = *array;

        for ( ; n--; ++array )
        {
            if ( *array < *ptrMin )
            {
                *ptrMin = *array;
            }
            else if ( *ptrMax < *array )
            {
                *ptrMax = *array;
            }                
        }

    }

    return success;
}

并调用

findMinMax( array, sizeof( array ) / sizeof( *array ), ptrMin, ptrMax );

这是一个示范程序

#include <stdio.h>

int findMinMax( const float *array, size_t n, float *ptrMin, float *ptrMax )
{
    int success = n != 0;

    if ( success )
    {
        *ptrMin = *array;
        *ptrMax = *array;

        for ( ; n--; ++array )
        {
            if ( *array < *ptrMin )
            {
                *ptrMin = *array;
            }
            else if ( *ptrMax < *array )
            {
                *ptrMax = *array;
            }                
        }

    }

    return success;
}

int main(void) 
{
    float array[5] = { 12, 32, 56, 67, 54 };

    float min;
    float max;

    float *ptrMin;
    float *ptrMax;

    ptrMin = &min;
    ptrMax = &max;

    findMinMax(array, sizeof( array ) / sizeof( *array ), ptrMin, ptrMax);

    printf("%f %f", *ptrMin, *ptrMax);

    return 0;
}

它的输出是

12.000000 67.000000

答案 2 :(得分:1)

您的问题

您正在将变量convert photo.jpg -bordercolor Green -border 5%x10% -background White label:"A nice memory" -background White -gravity east -append result.jpgptrMin设置为未初始化变量ptrMaxptrMinTemp的内容:

ptrMaxTemp

解决方案

只需将指针的内容设置为数组的第一个单元格,如下所示:

float ptrMinTemp;
float ptrMaxTemp;

*ptrMin = ptrMinTemp;
*ptrMax = ptrMaxTemp;