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的东西?有什么帮助吗?实现这一点的“正确”方式是什么?干杯..!

#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*/
4

1 回答 1

7

问题出在线路上

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

printArray迭代,直到找到值为 0 的元素。您尝试将零值写入超出a然后将数组传递pprintArray. p没有任何零元素,因此printArray在不可预知的时间内继续读取它,直到它崩溃或找到值为 0 的内存。

要解决此问题,您应该在调用之前为then set中的length+1元素分配空间。或者,您可以将第二个参数更改为数组大小并将其重新实现为pp[length] = 0printArrayprintArray

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

您还需要决定如何处理分配给pin的内存summary。您当前从函数中返回它,然后尝试使用free它。该free(p)行将永远不会执行,因为前面的return语句将控制权返回给调用函数。由于没有调用者summary使用返回值,最简单的解决方法是更改summary​​为返回void并删除该return p行。

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

于 2013-04-17T15:17:09.427 回答