我试图在数组中打印整数的摘要。例如,如果用户输入:"1 4 5 8"结果应该是:"1 5 10 18"(0+1= 1,1 +4= 5,5 +5= 10,10 +8= 18)当我运行这段代码并输入:"1 11 1"第一次结果是:"1 2 3 32767 256"在其他任何时候,它都按预期运行这样做的算法很简单,而且很有效,但我习惯了OOP和我刚开始学习c语言,这里好像有些不对劲,指针和malloc有问题吗?任何帮助吗?实现这一点的"正确"方式是什么?干杯. . !
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
/*function prototype*/
int* summary(int a[], int length);
void printArray(int array[], int i);
int main(){
int k;
int length=0;
int userArray[MAX];
printf("Enter some numbers:n");
while((scanf("%d", &k) ==1)){
userArray[length] = k;
length++;
/*print the array after 'Enter' key pressed*/
if(getchar() == 'n'){
summary(userArray, length);
length = 0;
printf("n");
}/*if*/
}/*while*/
summary(userArray, length);
printf("n");
return 0;
}/*main*/
int* summary(int a[], int length){
int i;
int counter = 0;
int *p;
p = (int *) malloc(length * sizeof(int));
if(!p){
printf("memory allocation failed!");
exit(0);
}/*if null*/
for(i=0 ; i<length ; i++){
counter+=a[i];
p[i] = counter;
}/*for*/
a[length] = ' ';
printArray(p, 0);
return p;
free(p);
}/*summary*/
void printArray(int array[], int i){
if(array[i]==' '){
printf("finished printing");
return;
}
else{
printf(" %dn", array[i]);
printArray(array, i+1);
}
}/*printArray*/
问题出在
a[length] = ' ';
printArray(p, 0);
printArray
迭代直到找到值为0的元素。您已经尝试在a
的末尾之外编写零值,然后将数组p
传递到printArray
。p
没有任何零元素,所以printArray
在不可预测的时间内继续读取,直到它崩溃或找到值为0的内存。
要解决这个问题,您应该在p
中为length+1
元素分配空间,然后在调用printArray
之前设置p[length] = 0
。或者,您可以将第二个参数printArray
更改为数组大小,并将其重新实现为
void printArray(int* array, int size){
for (int i=0; i<size; i++) {
printf(" %dn", array[i]);
}
printf("finished printing");
}/*prinArray*/
您还需要决定如何处理您在summary
中为p
分配的内存。您当前从函数返回这个,然后尝试free
它。free(p)
行永远不会被执行,因为前面的return
语句将控制返回给调用函数。由于没有summary
的调用者使用返回值,最简单的修复方法是将summary
更改为返回void
并删除return p
行。
注意,如果启用警告,编译器应该标记最后一个问题。(将-Wall
添加到gcc的命令行中,或将/W4
添加到MSVC的命令行中)