2014-12-30 2 views
1

Я компилирую следующий код в своем m/c с использованием кодовых блоков и mingw32-gcc.exe v.4.8.1 (tdm-2).Вне массива элементов, которые печатаются с использованием gcc в Win8

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int a[8] = {3,1,10,-1,7,2,-8,1}; 
    int b[8] = {3,1,10,-1,7,2,-8,1}; 
    int i=0,alength = (int)sizeof(a)/sizeof(a[0]); 

    for(i = 0; i < alength; i++){ 
      if(a[i] > a[i+1]){ 
       a[i+1] = a[i] + a[i+1]; 
       a[i] = a[i+1] - a[i]; 
       a[i+1] = a[i+1] - a[i]; 
      } 
    } 

    printf("Original array size is %d \n", alength); 
    printf("Original array elements are given below: \n"); 
    printf("Sizeof(a) is %d \n", sizeof(a)); 
    for(i = 0; i < alength; i++){ 
     printf("\n b[%d] = %d", i, b[i]); 
    } 

    for(i = 0; i < alength; i++){ 
     printf("\na[%d] = %d", i, a[i]); 
    } 
} 

Это дает мне следующий результат. Здесь для каждого массива печатаются два дополнительных элемента.

Original array size is 10 
Original array elements are given below: 
Sizeof(a) is 32 

b[0] = 3 
b[1] = 1 
b[2] = 10 
b[3] = -1 
b[4] = 7 
b[5] = 2 
b[6] = -8 
b[7] = 1 
b[8] = 1 
b[9] = 3 
a[0] = 1 
a[1] = 3 
a[2] = -1 
a[3] = 7 
a[4] = 2 
a[5] = -8 
a[6] = 1 
a[7] = 8 
a[8] = 10 
a[9] = 9 

Но компиляция того же кода в online compiler дает правильный результат. ОС - Win8 64bit. Любая помощь в объяснении и разрешении разницы будет оценена.

ответ

5

Доступ к элементу связанного массива вызывает неопределенное поведение, и это приведет к ожидаемому или неожиданному результату.

Изменить

for(i = 0; i < alength; i++){ 
     if(a[i] > a[i+1]){ ... 
     ... 
    } 

в

for(i = 0; i < alength-1; i++){ 
     if(a[i] > a[i+1]){ ... 
     ... 
} 
+0

Спасибо за исправление ошибки при доступе к массиву из привязанного. –

4

У вас есть само определение неопределенного поведения, в частности однополярное сортирование пузырьков, которое вы пытаетесь написать. i идет от 0 до alength-1, покрывая весь массив, затем вы указываете a[i+1], который будет проходить мимо конца.

Если бы я должен был догадаться, что конкретно вызывает разницу, одна машина строит в режиме отладки введения часовому между a и b, так что в одном случае вы сравниваете a[7] либо b[0] (собирается поменять) или с a[8] (дозорный, который обычно является большим числом, поэтому он не собирается меняться).

TL; DR: Неопределенное поведение.

+0

Можно добавить, что вычисление размера массива неправильно. И неизвестное неопределенное поведение становится предсказуемым. – icbytes

+1

Это никогда не предсказуемо, если вы не заблокируете каждую вещь, связанную с запуском этого кода, и даже тогда вы узнаете, как только вы запустите его, какой путь он займет. – Blindy

+1

@icbytes Вычисление 'alength' является правильным, но, вероятно, оно перезаписывается при записи в конце массива. – user694733