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);

printArraya値が 0 の要素が見つかるまで繰り返します。に渡された配列の末尾を超えてゼロ値を書き込もうとpしましたprintArraypにはゼロ要素がないprintArrayため、クラッシュするか値 0 のメモリが見つかるまで、予測できない時間にわたって読み取りを続けます。

これを修正するには、 を呼び出す前にset内のlength+1要素にスペースを割り当てる必要があります。または、2 番目の引数を配列サイズに変更して、次のように再実装することもできます。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*/

pで割り当てたメモリをどうするかを決める必要もありますsummary。現在、関数からこれを返し、試してみてくださいfree。前のステートメントが呼び出し元の関数に制御を返すため、このfree(p)行は実行されません。returnの呼び出し元は戻り値を使用しないため、最も簡単な修正はreturnsummaryに変更して行を削除することです。summaryvoidreturn p

警告を有効にする場合、この最後の問題はコンパイラによってフラグが立てられることに注意してください。-Wall( gcc または/W4MSVCのコマンド ラインに追加します)

于 2013-04-17T15:17:09.427 に答える