0

私は問題に直面しており、確かに何か間違ったことをしています。int の配列へのポインターを返す関数を呼び出す必要がありますが、返された後、配列内の値が間違っていて、いくつかの値が欠落しています。

int* patternForFirstDigit(int digit) {
    int *pattern;
    pattern = (int [6]){1,1,1,1,1,1};

    switch (digit) {
        case 0:
            pattern = (int [6]){1,1,1,1,1,1};
            break;

        case 1:
            pattern = (int [6]){1,1,2,1,2,2};
            break;

        default:
            pattern = (int [6]){0,0,0,0,0,0};
            break;
    }

    for (int i = 0; i < 6; i++) {
         printf("%i\n", pattern[i]);
    }

    return pattern;
}

数字 = 1 の場合は、次のように出力されます。

1, 1, 2, 1, 2, 2

でも帰ってから

int *pattern = patternForFirstDigit(0);
for (int i = 0; i < 6; i++) {
     printf("%i\n", pattern[i]);
}

印刷したものはこちら

1, -1405451528, -1405449120, 366001

何が悪いのか分かりますか?

みんなありがとう

PS:私はXcode 4.6を使用しており、私のプロジェクトはARCを使用していますが、それが私の問題の理由ではないと確信しています.

4

3 に答える 3

5

関数で作成された配列へのポインターを返すことはできません。この配列は、関数が返された後は存在しなくなるため、ポインターはメモリ内のランダムで無効な場所を指します。

malloc()(たとえばを使用して) ポインターにメモリを割り当ててから、ポインターを返します。これは、ポインターを使い終わった後にポインターを解放する必要があることも意味します ( を使用free())。

このための疑似コードは次のようになります。

int* patternForFirstDigit(int digit) {
  int *pattern = (int*) malloc(sizeof(int)*N);
  pattern[0] = 0;
  pattern[1] = 1;
  ...

  // Alternatively just create a local array and use a for-loop
  // to copy the contents to the pattern array.

  return pattern;
}

int *p = patternForFirstDigit(M);
// use p
free(p);
于 2013-03-28T10:08:15.723 に答える
1

(int [6]){1,1,2,1,2,2};

関数で定義されたローカル配列です。そのため、関数が実行を終了すると、配列のデータが消去される可能性があります。そのため、ガベージ値を取得しますprintf

1)malloc代わりに配列を割り当てるために使用します

int* patternForFirstDigit(int digit) {
    int *pattern = malloc(6*sizeof(int));

    memcpy(pattern, (int [6]){1,1,1,1,1,1}, 6*sizeof(int));

    switch (digit) {
        case 0:
            memcpy(pattern, (int [6]){1,1,1,1,1,1}, 6*sizeof(int));
            break;

        case 1:
            memcpy(pattern, (int [6]){1,1,2,1,2,2};, 6*sizeof(int));
            break;

        default:
            memcpy(pattern, (int [6]){0,0,0,0,0,0}, 6*sizeof(int));
            break;
    }

    for (int i = 0; i < 6; i++) {
         printf("%i\n", pattern[i]);
    }

    return pattern;
}

そして、コードのどこかがpattern役に立たなくなったら、それを解放しますfree(pattern);

2) またはstatic、配列の定義で使用します。

int* patternForFirstDigit(int digit) {
    int *pattern; int i;
    static int A[6]={1,1,1,1,1,1};
    static int B[6]={1,1,2,1,2,2};
    static int C[6]={0,0,0,0,0,0};
    pattern = A;

    switch (digit) {
        case 0:
            pattern = A;
            break;

        case 1:
            pattern = B;
            break;

        default:
            pattern = C;
            break;
    }

    for (i = 0; i < 6; i++) {
         printf("%i\n", pattern[i]);
    }

    return pattern;
}
于 2013-03-28T10:08:48.387 に答える
0

問題は、ローカル変数を返すためです。ローカル変数は一時的な変数であり、スコープがなくなると使用できなくなります。次のことを試してみてください。

int* patternForFirstDigit(int digit, int* pattern) {

    int* pattern1 = (int [6]){1,1,1,1,1,1};
int i;
    switch (digit) {
        case 0:
            pattern1 = (int [6]){1,1,1,1,1,1};
            break;

        case 1:
            pattern1 = (int [6]){1,1,2,1,2,2};
            break;

        default:
            pattern1 = (int [6]){0,0,0,0,0,0};
            break;
    }
memcpy(pattern,pattern1,6*sizeof(int));
    for ( i = 0; i < 6; i++) {
         printf("%i\n", pattern[i]);
    }
    return pattern;
}

次に、次のように使用できます。

pattern = malloc(6*sizeof(int));
pattern=patternForFirstDigit(1, pattern);
int i;
for ( i = 0; i < 6; i++) {
     printf("%i\n", pattern[i]);
}
free(pattern);
于 2013-03-28T10:11:24.910 に答える