2017-12-01 1 views
0

配列に文字列を保存して印刷しようとしていますが、最初のレコードが保存された後、配列全体がナンセンスで(Visual Studioデバッガにしたがって)私は間違って何をしていますか?最初の挿入後に配列が不確定な値で埋められます

int saveRecord(int ixA, int ixB, int length, int* ocupied, char**arr) 
{ 
    char r[50]; 
    sprintf(r,"%d: %d - %d", length, ixA, ixB); 
    arr[*ocupied] = r; 
    (*ocupied)++; 
    return 0; 
} 
int printRecords(int ocupied, char** arr) 
{ 
    for (int i = 0; i < ocupied; i++) 
    { 
    printf("%s\n", arr[i]); 
    } 
    printf("Options: %d\n", ocupied); 
    return 0; 
} 
int main() 
{ 
    int length = 0, ixA = 0, ixB = 0; 
    int* ocupied; 
    int a = 0; 
    ocupied = &a; 
    char r[50] = ""; 
    char *arr[250000]; 
    for (int i = 0; i < 250000; i++) 
    { 
    arr[i] = ""; 
    } 
    for (int i = 0; i < 10; i++) 
    { 
    scanf("%d %d %d", &ixA, &ixB, &length); 
    saveRecord(ixA, ixB, length, ocupied, arr); 
    } 
    printRecords(*ocupied, arr); 
} 
+0

あなたは、誰もがそれをすべて読むことを期待していた場合、適切にあなたのコードをフォーマットしてください。 –

+0

'saveRecord'では、ローカル配列' r'を 'arr []'に代入します。この配列は、関数を終了するときに範囲外になります。そのため、配列を印刷すると無効になります。あなたの配列を配列の配列にするか、メモリを割り当てて文字列をコピーして(そして後で解放する)必要があります。 –

答えて

0

問題がsaveRecordである:ローカル配列ですrにあなたの配列の値を、設定している

char r[50]; 
sprintf(r,"%d: %d - %d", length, ixA, ixB); 
arr[*ocupied] = r; 

。この文脈において、arr[*ocupied]は、rの最初の要素へのポインタを含む。 saveRecordが復帰すると、rが範囲外になるので、今すぐ保存したポインタは無効なメモリを指しています。ローカル変数へのポインタを返した後、逆参照すると、undefined behaviorが呼び出されます。

あなたはこのデータは、関数の外を永続化したいので、あなたが動的代わりにローカル変数を使用してのメモリを割り当てる必要があります。

// find out exactly how much space is needed 
int len = snprintf(NULL, 0, "%d: %d - %d", length, ixA, ixB); 
arr[*ocupied] = malloc(len + 1); 
snprintf(arr[*ocupied], len + 1, "%d: %d - %d", length, ixA, ixB); 
関連する問題