C指向数组示例的指针停止工作

时间:2017-05-28 15:53:49

标签: c arrays pointers

我正在研究一个例子,当我运行它时,我的代码停止了。(请注意,我将问题翻译成英文,对于语法错误感到遗憾。) 以下是问题:

myShrink()函数的原型是这样的:

void myShrink(int *param1, const int param2); 

myShrink()函数应该找到数组param1的平均值然后如果它小于平均值则应该将元素递增1,或者如果它超过平均值则应该将元素递减1 。 param2是数组中的一些元素。

以下是main()功能的内容:

void myStretch(int *param1, const int param2); 

int main () {  int myArray[] = {2, 4, 2, 4, 2, 4}; 

 int index;    
 myStretch(myArray, 6); 

 printf("UPDATED ARRAY: "); 

 for(index = 0; index < 6; index++){
 printf("%d\t", myArray[index]);
 } 

 return 0;
 } 

---------运行程序时的结果:-----

更新阵列:1 5 1 5 1 5

现在这是问题部分我们需要的是基本编程myShrink()函数的内容,这是我的工作:

void myShrink(int *param1, const int param2)
{
    int array[param2];
    param1=array;//Using pointer to point elements of array
    int average=0;
    int i,j;
    for(i=0;i<param2;i++)
    {
        average+=*(param1 + i);//Adding each element of array
    }
        average=average/param2;//Then dividing result to param2 to find average

    for(j=0;j<param2;j++)
    {
        if(*(param1+j)<average)//if below average
        {
            *(param1+j)+=1;//increment
        }
        else if(*(param1+j)>average)//if above average
        {
             *(param1+j)-=1;//decrement
        }
    }
}

但是当我运行它时它停止工作。在哪里我犯了错误,我该如何解决?

2 个答案:

答案 0 :(得分:0)

这样做:

#include<stdio.h>

void myStretch(int *param1, const int param2);

int main () {  int myArray[] = {2, 4, 2, 4, 2, 4};

int index;
myStretch(myArray, 6);

printf("UPDATED ARRAY: ");

for(index = 0; index < 6; index++){
printf("\n%d\t", myArray[index]);
}

return 0;
}

void myStretch(int *param1, const int param2)
{

int average=0;
int i,j;
for(i=0;i<param2;i++)
{
    average+=*(param1 + i);//Adding each element of array
}
    average=average/param2;//Then dividing result to param2 to find average

for(j=0;j<param2;j++)
{
    if(*(param1+j)<average)//if below average
    {

        (*(param1+j))+=1;//increment
    }
    else if(*(param1+j)>average)//if above average
    {
         printf("%d ",(*(param1+j)));
         (*(param1+j))-=1;//decrement
    }
}
}

现在首先:你的结果是错的。应该是3 3 3 3 3 3.由于这种情况下的平均值为3,因此2将变为3,而4也将变为3.其次,您不必在函数内部分配新数组。就这样做吧。第三个错误:

*(param1+j)>average

应替换为

(*(param1+j))>average

并且类似于低于标志。 更新:还要注意很多人认为数组[param2]是合法的还是不合法的。声明这样的数组时,它们被称为可变长度数组(VLA)。这在现代C编译器中是允许的,但是像Turbo C这样的旧编译器不允许这样做。

答案 1 :(得分:0)

myShrink 函数下面,'param1 = array;'之后声明 param1 开始指向内部有垃圾的数组。

void myShrink(int *param1, const int param2){
int array[param2];
param1=array;//Using pointer to point elements of array
int average=0;
int i,j;

//debug code to shows param1 points to array which has garage inside
int index =0 ;
for(index = 0; index < 6; index++){
    printf("myDebug: %d\n", param1[index]);
}

for(i=0;i<param2;i++)
{
    average+=*(param1 + i);//Adding each element of array
}
    average=average/param2;//Then dividing result to param2 to find average

for(j=0;j<param2;j++)
{
    if(*(param1+j)<average)//if below average
    {
        *(param1+j)+=1;//increment
    }
    else if(*(param1+j)>average)//if above average
    {
         *(param1+j)-=1;//decrement
    }
}}