簡體   English   中英

c-在函數中初始化的數組的指針在返回后包含錯誤的值

[英]c - Pointer of array initialized in a function contains wrong values after returning

我面臨一個問題,我肯定做錯了什么。 我需要調用一個函數,該函數返回一個指向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,但我敢肯定這不是問題的原因。

您不能返回指向在函數中創建的數組的指針。 函數返回后該數組不再存在,因此您的指針指向內存中某個隨機的無效位置。

為指針分配內存(例如,使用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);

(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);將其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;
}

問題是因為您正在返回局部變量。 局部變量是一個臨時變量,在其作用域消失后不再可用。 您可以嘗試以下方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM