2013-04-17 41 views
2

我试图在数组中打印整数的摘要。例如,如果用户键入:“1 4 5 8” 结果应该是:“1 5 10 18”(0 + 1 = 1,1 + 4 = 5,5 + 5 = 10,10 + 8 = 18 ) 当我运行此代码的输入:“1 1 1” 第一次结果是:“1 2 3 32767 256” 和任何其他时间运行如期:\ 这样做的算法很简单,它的工作原理但我习惯了OOP和 刚刚开始学习C.这里的东西似乎不正确..什么东西与指针或malloc?任何帮助? 执行此操作的“正确”方式是什么? 干杯..!如何在C中打印数组元素的摘要

#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] = '\0'; 
    printArray(p, 0); 
    return p; 
    free(p); 
}/*summary*/ 

void printArray(int array[], int i){ 
    if(array[i]=='\0'){ 
     printf("finished printing"); 
     return; 
    } 
    else{ 
     printf(" %d\n", array[i]); 
     printArray(array, i+1); 
    } 
}/*printArray*/ 

回答

7

的问题是在线

a[length] = '\0'; 
printArray(p, 0); 

printArray迭代,直到它找到与值0的元素您已尝试写入零值超出a结束然后传递数组pprintArrayp没有任何零元这样printArray继续阅读超越它的不可预知的时间,直到它崩溃或与价值发现内存0

为了解决这个问题,你应该分配空间中plength+1元素然后设置p[length] = 0前呼叫printArray。另外,您也可以在第二个参数更改为printArray是数组的大小,并重新实现它作为

void printArray(int* array, int size){ 
    for (int i=0; i<size; i++) { 
     printf(" %d\n", array[i]); 
    } 
    printf("finished printing"); 
}/*prinArray*/ 

您还需要决定如何处理你summary分配为p内存做。你现在从函数返回这个,然后尝试到free它。由于前面的return语句将控制权返回给调用函数,所以free(p)行将不会执行。由于summary没有调用者使用返回值,因此最简单的修复方法是更改​​summary以返回void并删除return p行。

请注意,如果您启用了警告,则最后一个问题应由编译器标记。 (将gcc的-Wall添加到您的命令行或MSVC的/W4

+0

非常感谢您的快速和高效的响应,您非常帮助我! – Raskanskyz