我在函数计算中的平均值有问题,没有返回正确的数字,并且兰特返回值等于,我不知道平均值不好的原因
#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));
}
答案 0 :(得分:3)
此:
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]);
}
下面:
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));
}
rand
,以便在每次运行程序时获取一组不同的随机值,这样您就不会在每次运行程序时获得相同的随机数集。包括srand(time(NULL));
后,在main
开头添加time.h
。如果程序在同一秒内运行不止一次,这将返回一组不同的随机数。tam
引用传递给calcular
,这没有任何意义。相反,请按值传递。malloc
(and family) 考虑检查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()
的无效地址的指针,这是未定义的行为。
其他一些注意事项
让您的代码对人类可读
带有空格的环绕操作员,它为代码增加了很多清晰度,因为否则很难区分令牌。
正确缩进代码。
您不需要投射malloc()
,这也提高了可读性。
检查malloc()
为NULL
返回的指针,错误malloc()
返回NULL
,如果取消引用NULL
指针未定义的行为将发生。
使用strtol()
代替atoi()
检查无效输入,例如
char *endptr;
tam = strtol(argv[1], &endptr, 10);
if (*endptr != '\0')
return -1; /* invalid input */