2017-02-24 8 views
-1

2次元の配列を持っていますが、最初に配列のデータを印刷すると、日付は正しく表示されますが、もう1度はarray [last] [i] i = 0〜last - 1メモリの値が無許可で変更されました

明らかに論理エラーですが、私はfor文をコピーして貼り付けるので、理由はわかりません。だから...データを変更する?

私はgcc -std=c99を使用しますが、それ以前はC++とcoutのステートメントを試しています。私はそれが見るように

This is the output screenshot

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    unsigned int numero_jugaderes = 11; 
    unsigned int numero = numero_jugaderes - 1; 

    unsigned int p_a[numero]; 

    float p_aya[numero][numero]; 

    for (unsigned int i = 0; i <= numero; i++) { 
    p_a[i] = i; 
    } 

    for (unsigned int i = 0; i <= numero; i++) { 
    for (unsigned int j = 0; j <= numero; j++) { 
     p_aya[i][j] = (float) (p_a[i] * p_a[j])/100; 
     printf("%f\t", p_aya[i][j]); 
    } 
    puts(""); 
    } 

    puts("\n"); 

    for (unsigned int i = 0; i <= numero; i++) { 
    for (unsigned int j = 0; j <= numero; j++) { 
     printf("%f\t", p_aya[i][j]); 
    } 
    puts(""); 
    } 

    return 0; 
} 
+0

これは、C++に[可変長配列](https://en.wikipedia.org/wiki/Variable-length_array)がないため、技術的には有効なC++プログラムではありません。 –

+0

@user私はそれが逆であると思います –

+0

あなたの問題については、X要素の配列は有効なインデックスが '0'から 'X - 1'(両端を含む)の範囲にあることに注意してください。今すぐあなたのループをよく見てみましょう。 –

答えて

5

問題、あなたは

unsigned int p_a[numero]; 

として定義配列のため

for (unsigned int i = 0; i <= numero; i++) 

などの条件チェックを超えるループしているとあなたはoff-by-oneになります。これは本質的に無効なメモリアクセスであり、undefined behaviorを呼び出します。有効な限界が

for (unsigned int i = 0; i < numero; i++) 
0

もしnumero要素を有するものとして宣言された配列を有する場合、インデックスの有効範囲は[0, numero-1]であろうよう

Cアレイは、0から始まるインデックスを有します。未定義の動作にnumero要素の結果と配列の要素にアクセスするために使用されるこの

for (unsigned int i = 0; i <= numero; i++) { 

従って、このようなループ。

1

長さnumeroの配列には、numero要素があります。インデックス0からnumero-1に移動します。彼らはインデックスnumeroようにそれらを扱っています。 i < numeroの場合はi <= numeroに切り替えてください。すべてのforループとjについて同じことを行います。

関連する問題