2016-01-15 5 views
1

В моем коде на C я получаю ошибку сегментации, которую я не могу понять. Кто-нибудь знает, в чем проблема?Получение ошибки сегментации в C

#include <stdio.h> 
#include <time.h> 

#define MAX(x, y) (((x) > (y)) ? (x) : (y)) 
#define MIN(x, y) (((x) < (y)) ? (x) : (y)) 

int main() {  
    printf("a"); 
    time_t start_t, end_t; 
    double diff_t; 
    time(&start_t); 

    int width = 440; 
    int height = 280; 
    int w = 25; 
    int b = 15; 
    int oo = 5; 
    int pheight = 70; 

    int m1, m2, m3, m4; 
    double *points; 
    printf("a"); 
    int data[2][width][height][width][height][height]; 
    printf("b"); 
    int side, ballx, bally, oballx, obally, py; 

    for (side = 0; side < 2; side++) { 
     for (ballx = w; ballx < width - w - b; ballx++) { 
      for (bally = 0; bally < height - b; bally++) { 
       if (side == 1) { 
        m1 = MAX(w, ballx - oo); 
        m2 = MIN(width - w - b, ballx); 
       } else { 
        m1 = MAX(w, ballx); 
        m2 = MIN(width - w - b, ballx + oo); 
       } 
       for (oballx = m1; oballx < m2; oballx++) { 
        m3 = MAX(0, bally - oo); 
        m4 = MIN(height - b, bally + oo); 
        for (obally = m3; obally < m4; obally++) { 
         for (py = 0; py < height - pheight; py++) { 
          time(&end_t); 
          diff_t = difftime(end_t, start_t); 
          printf("side %d ballx %d bally %d oballx %d obally %d py %d time %f", 
            side, ballx, bally, oballx, obally, py, diff_t); 
         } 
        } 
       } 
      } 
     } 
    } 
    return 0; 
} 
+6

Что это за * int данные [2] [ширина] [высота] [ширина] [высота] [высота]; '? –

+0

Это будет '8499814400000 * sizeof (int)' –

+1

спасибо за хороший смех! сделал мой день! +1 – chqrlie

ответ

4

кажется, что это, возможно, не является причиной этой проблемы, но все же стоит отметить, что мега массив data явно слишком велик для размера стека вашей среды, таким образом, ваша программа вызывает Stack Переполнение.

Он использует 33999257600000 (предполагая sizeof(int) быть 4, который почти наверняка имеет место) байт или 31664GB, что много даже выделить в куче,

#include <stdlib.h> 

int main(void) 
{ 
    char *example; 
    example = malloc(33999257600000); 
    if (example == NULL) 
     fprintf(stderr, "Impossible to allocate so much memory\n"); 
    free(example); 
    return 0; 
} 

код выше напечатает Impossible ... на почти любой красивой машине, скажем, 64 ГБ оперативной памяти.

+0

Я поставил операторы печати как первую строку, но после запуска он даже не распечатывал это? – omega

+0

@omega: это не потому, что вы не 'fflush (stdout);' after 'printf (" a ");' – chqrlie

+0

@iharob: технически, массив 'data' не * используется * в функции, поэтому компилятор не должен даже беспокоить выделение его из стека ... но его нужно путать. – chqrlie

2

Неясно, почему вы определяете data таким образом:

int data[2][width][height][width][height][height]; 

Но хотя data не используется в функции main, компилятор генерирует код, чтобы попытаться выделить его из автоматического хранения (ака в стеке). Это слишком велико, поэтому вы вызываете неопределенное поведение.

Ваш первый и второй printf не попадает на консоль, скорее всего, из-за того, что вы не вручную сбросили stdout перед сбоем. Попробуйте fflush(stdout); после каждого отладки printf.

Обратите внимание, что вводить в заблуждение имена переменных, заканчивающиеся на _t, такие как start_t, end_t и diff_t. Этот суффикс обычно зарезервирован для типов.

Также обратите внимание на удовольствия, что делает экран больше может исправить эту проблему:

int width = 8192; 
int height = 4096; 

сделает data настолько велик, что его размер будет переполнение 64 бита и сводятся к 0 байт. Компилятор может заметить переполнение и жалобу или просто сгенерировать код, чтобы выделить 0 байт и работать плавно ... Оба принятых экземпляра неопределенного поведения.

Смежные вопросы