int的指针计算平均值

时间:2015-10-04 14:11:51

标签: c

我在函数计算中的平均值有问题,没有返回正确的数字,并且兰特返回值等于,我不知道平均值不好的原因

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

int calcular(int * _arreglo, int * _tam);

int main(int argc, char * argv[]) {
    int tam = 0;
    if (argc == 2) {
        tam = atoi(argv[1]);
    } else {
        printf("No se ha ingresado correctamente el tamaño \n");
        exit(1);
    }
    int * arreglo;
    arreglo = (int * ) malloc(sizeof(int) * tam);
    int i;
    for (i = 0; i < tam; i++) {
        arreglo = (int * )(rand() % 101);
        printf("soy %d \n", ((int)(arreglo)));
        arreglo++;
    }
    int promedio = calcular(arreglo, & tam);
    printf("Promedio: %d \n", promedio);
    free(arreglo);
    return 0;
}

int calcular(int * _arreglo, int * _tam) {
    int pro = 0;
    int i;
    _arreglo = _arreglo - ( * _tam);
    for (i = 0; i < * _tam; i++) {
        pro = pro + ((int)(_arreglo));
        _arreglo++;
    }
    return (pro / ( * _tam));
}

2 个答案:

答案 0 :(得分:3)

主要问题:

  1. 此:

    for(i=0;i<tam;i++){
    arreglo=(int *)(rand()%101);
    printf("soy %d \n",((int)(arreglo)));
    arreglo++;
    }
    

    没有任何意义。你可能想要

    for(i = 0; i < tam; i++) {
        arreglo[i] = (rand() % 101);
        printf("soy %d \n", arreglo[i]);
    }
    
  2. 下面:

    int calcular(int *_arreglo, int *_tam){
    int pro=0;
    int i;
    _arreglo=_arreglo-(*_tam);
    for(i=0;i<*_tam;i++){
    pro=pro+((int)(_arreglo));
    _arreglo++;
    }
    return (pro/(*_tam));
    }
    
    你可能想要

    int calcular(int *_arreglo, int *_tam){
        int pro = 0;
        int i;
    
        for(i = 0; i < *_tam; i++){
            pro = pro + _arreglo[i];
        }
    
        return (pro / (*_tam));
    }
    
  3. 其他问题:

    1. 您需要调用种子rand,以便在每次运行程序时获取一组不同的随机值,这样您就不会在每次运行程序时获得相同的随机数集。包括srand(time(NULL));后,在main开头添加time.h。如果程序在同一秒内运行不止一次,这将返回一组不同的随机数。
    2. 为什么要将tam引用传递给calcular,这没有任何意义。相反,请按值传递。
    3. C中的
    4. There is no need cast the result of malloc (and family)
    5. 考虑检查malloc的返回值,看它是否成功。变化:

      arreglo = (int * ) malloc(sizeof(int) * tam);
      

      if((arreglo = malloc(sizeof(int) * tam)) == NULL) /* If malloc failed */
      {
          fputs("malloc failed; Exiting...", stderr); /* Print the error message in the `stderr` */
          exit(-1); /* Exit the program */
      }
      

答案 1 :(得分:1)

你有一个严重的错误

arreglo = (int *) (rand() % 101);

为指针arreglo分配一个随机地址,取消引用它是未定义的行为。

malloc()之后重新指定指针会导致内存泄漏,因为现在您无法free() malloc()返回的指针。此外,您free()指向带有rand()的无效地址的指针,这是未定义的行为。

其他一些注意事项

  1. 让您的代码对人类可读

    • 带有空格的环绕操作员,它为代码增加了很多清晰度,因为否则很难区分令牌

    • 正确缩进代码。

  2. 您不需要投射malloc(),这也提高了可读性。

  3. 检查malloc()NULL返回的指针,错误malloc()返回NULL,如果取消引用NULL指针未定义的行为将发生。

  4. 使用strtol()代替atoi()检查无效输入,例如

    char *endptr;
    tam = strtol(argv[1], &endptr, 10);
    if (*endptr != '\0')
        return -1; /* invalid input */