如何在C中打印数组元素的摘要



我试图在数组中打印整数的摘要。例如,如果用户输入:"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传递到printArrayp没有任何零元素,所以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的命令行中)

相关内容

  • 没有找到相关文章

最新更新