我在数组中的指针无法正常运行

时间:2019-08-27 15:26:43

标签: c

我想创建一个函数,该函数将接受1:array_of_int和2:size_of_array,然后返回3个最大整数的和。代码如下:

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

int max_3(int arr[], int asize)
{ 
   int max_arr[3];
   int max =0; 
   int sum = 0;
   int* pi; 

   for(int j=0; j<3; j++)
   {   
      for(int i =0; i<asize;i++)
      {   
         if(arr[i] > max)
         {
           max = arr[i];
           pi = (arr + i); // to know the address of the max int of 'i' cycle
         }
      }   
      max_arr[j] = max;
      *pi = 0; // make the max int = 0 so that the next 'i' cycle doesnt have the previous max in it 
               //(so it can look for another max value - the second one)
   }   

   for(int i=0; i<3; i++)
      sum += max_arr[i];

   return sum;
}


int main (int argc, char** argv) {
   int arr[6] = {1,5,9,12,16,14};
   printf("%i\n",max_3(arr, 6));
   return (EXIT_SUCCESS);
}

指针pi的值不等于当前max的值0,而for (int i..)中的下一个周期又变为前一个最大。因此,它没有返回max val1 + val2 + val3,而是返回了3 * val1(最大的)-在我的特定示例中,它打印出48而不是42(12 + 16 + 14) - 正如它应该。但是,当我将地址的值(指针指向的)设为0时,该怎么办?我不太了解。

3 个答案:

答案 0 :(得分:1)

您的if语句:

if (arr[i] > max)
第一次找到max(在j > 0时为)之后,不会再输入

您需要在以下时间将其归零:

max_arr[j] = max;
max = 0;

答案 1 :(得分:0)

以下建议的代码:

  1. 执行所需的功能
  2. 其算法非常简单
  3. 结合了冒泡排序,用于选择数组中的前三项
  4. 消除了“魔术”数字6
  5. 将第二个参数修改为类型size_t,因为它是sizeof()返回的类型
  6. 表达式:sizeof(arr)/sizeof(arr[0])使编译器可以计算数组中的条目数
  7. 语句:int arr[] = {1,5,9,12,16,14};让编译器为数组分配空间
  8. 排序时避免修改原始数组

现在,建议的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>  // memcpy()


void swap(int *xp, int *yp) 
{ 
    int temp = *xp; 
    *xp = *yp; 
    *yp = temp; 
} 


// A function to implement bubble sort 
void bubbleSort(int arr[], size_t n) 
{ 
    size_t i;
    size_t j; 
    for (i = 0; i < n-1; i++)  
    {     
       // Last i elements are already in place    
       for (j = 0; j < n-i-1; j++)  
       {
            if (arr[j] > arr[j+1]) 
            {
              swap(&arr[j], &arr[j+1]); 
            }
        }
    }
} 


int max_3(int arr[], size_t asize)
{ 
    int localArray[ asize ];
    memcpy( localArray, arr, asize*sizeof( int ) );
    // sort array
    bubbleSort( localArray, asize );

    // calculate sum of max 3 entries
    int sum = localArray[asize-1] + localArray[asize-2] + localArray[asize-3];
    return sum;
}   


int main ( void ) 
{
   int arr[] = {1,5,9,12,16,14};
   printf( "%i\n", max_3( arr, sizeof(arr)/sizeof(arr[0])) );
   return (EXIT_SUCCESS);
}

运行建议的代码将导致:

42

答案 2 :(得分:0)

在外循环(循环for(int j=0; j<3; j++))的第一次迭代之后,maxpi的值将永远不变。

在外循环的第一次迭代中,您将发现数组中的第五个元素最大,max等于16,而pi则指向该数组元件。您将max_arr[0]设置为16,并将*pi设置为零。然后,外循环从max仍等于16开始。现在,数组中将没有等于或大于该值的值。因此,您也将max_arr[1]设置为16,并将*pi(其中pi仍指向第五个元素)再次 设置为零。下一次迭代也是一样。

自然的解决方案是在外部循环内部定义maxpi

for(int j=0; j<3; j++)
{
    // The variables will be redefined and reinitialized each iteration of the loop
    int max = 0;
    int *pi;

    for(int i =0; i<asize;i++)
    {
        if(arr[i] > max)
        {
            max = arr[i];
            pi = (arr + i); // to know the address of the max int of 'i' cycle
        }
    }
    max_arr[j] = max;
    *pi = 0; // make the max int = 0 so that the next 'i' cycle doesnt have the previous max in it
             //(so it can look for another max value - the second one)
}

该代码还有其他一些问题,例如pi永远不会被初始化的可能性。我将其作为练习供读者了解何时会发生以及如何解决。