2017-10-19 30 views
0

Je veux savoir pourquoi mon code donne une valeur modifiée de y [0] quand je ne le change nulle part explicitement. Je vous ai fourni la sortie de la liaison ci-dessous:Comportement indéfini: la valeur de l'élément de tableau change implicitement/illogiquement

Code Output

code:

#include <iostream> 

int main() { 
    std::cout << "Enter total number of values of x/y" << std::endl; 
    int n; 
    std::cin >> n; 

    double x[n]; 
    double y[n]; 
    double df[n - 1][n - 1]; 

    std::cout << "Enter values of x:" << std::endl; 

    for (int i = 0; i < n; i++) { 
     std::cin >> x[i]; 
    } 

    std::cout << "Enter values of y:" << std::endl; 

    for (int i = 0; i < n; i++) { 
     std::cin >> y[i]; 
    } 

    std::cout << std::endl; 

    for (int i = 0; i < n; i++) { 
     df[i][0] = y[i + 1] - y[i]; 
    } 

    std::cout << "value of y[0] before: " << y[0] << std::endl; 

    for (int j = 1; j < n - 1; j++) { 
     for (int i = 0; i < n; i++) { 
      df[i][j] = df[i + 1][j - 1] - df[i][j - 1]; 
     } 
    } 

    std::cout << "value of y[0] after: " << y[0] << std::endl; 
} 

, il donne également une valeur stable de y [0] si j'allouer dynamiquement la mémoire en utilisant:

double* x = new double[n]; 
double* y = new double[n]; 

Je me suis référé à ce lien: Value of array member changes illogically, mais je n'ai pas pu obtenir une réponse claire sur la façon dont est cela arrive car il ne fournit pas de code (comme mentionné dans les commentaires).

Je veux savoir pourquoi cela se passe dans mon code avec des tableaux statiques et pas ceux alloués dynamiquement?

+2

Lors de la dernière itération de votre boucle d'affectation 'df' vous avez' i == n - 1'. Cela signifie que vous accédez 'df [n-1] [0]' qui est un après la fin du tableau. Accéder à cet élément est un comportement indéfini et peut expliquer tout problème que vous rencontrez. –

+2

'double x [n];' n'est pas le standard C++, quel compilateur utilisez-vous? – user463035818

+1

Pire, quand 'i == n - 1', la dernière boucle accède à' df [n] ', qui est deux éléments hors limites. – chris

Répondre

1

Vous lisez des limites hors limites à de nombreuses reprises appelant ainsi undefined behavior qui peut entraîner la valeur y[0] modifiée. Vous avez défini les limites du tableau avec:

double df[n - 1][n - 1]; 

mais avec les déclarations et expressions suivantes vous accédez à des éléments de tableau hors limites:

df[i][0] = y[i + 1] - y[i]; // everything except the y[i] 
df[i + 1][j - 1] 
df[i][j] 
df[i][j - 1]; 
df[i + 1][j - 1] 
df[i][0] = y[i + 1] - y[i] 
df[i][j] = df[i + 1][j - 1] - df[i][j - 1]; // everything 

Soit modifier les limites du tableau pour être supérieur à n-1 ou assurez-vous les indices sont moins que n-1 et n le cas échéant pour éviter un comportement indéfini. Cela étant dit, les tableaux de longueur variable ne font pas partie de la norme C++.

+0

Si les tableaux de longueur variable n'en font pas partie, le compilateur gcc standard ne devrait-il pas empêcher un tel code de se compiler en premier lieu? –

+0

@KewalShah Certains compilateurs le supportent, un avertissement est émis lors de l'utilisation des drapeaux appropriés. – Ron

+0

@KewalShah La plupart des compilateurs prennent en charge diverses extensions. Certaines extensions sont implicites (vous avez besoin d'un drapeau ou d'une option pour le désactiver) tandis que d'autres sont explicites (vous avez besoin d'un drapeau ou d'une option pour l'activer). Le support VLA de gcc est une extension implicitement active (qui fait bien plus de mal que de bien si vous me le demandez). –