2015-04-09 9 views
-2

я заявил следующее:Создания большого 2D массива

  1. long long int *a[100000] //Global Declaration

  2. Dynamic декларирование a[i]:

    a[i]=(long long int*)calloc(sizeof(long long int),100000); 
    
    for(i=0;i<100000;i++) { 
        for(j=0;j<100000;j++) 
         printf("%lld ",a[i][j]); 
         printf("\n"); 
    } 
    

После прохождения цикла моей программы с указанием ошибки сегментации

Из-за того, что я получаю правильный ответ на некоторые из тестовых примеров и ошибки сегментации в некоторых других случаях, это означает, что я не имею доступа к незаконной памяти. Я думаю Проблема связана с объявлением массива long long int такого большего размера.

+2

Вы должны определить двумерный массив, то есть 'долго долго ИНТ * а [100000] [100000]' – simurg

+0

Этот код не достаточно, чтобы сказать, что это не так, я подозреваю, что вы не выделять массив правильно.И [не бросать 'calloc'] (http://stackoverflow.com/a/605858/1983495), также использовать' malloc() 'только использовать' calloc() ', если вы действительно знаете, что вам нужно. –

+0

@simurg возможно 'long long int a [100000] [100000]' без '*'? –

ответ

-1

Почему вы не инициализируете, как long long int a[100000][100000]? Слишком большой?

Я боюсь, что таким образом вы головоломка компилятора, потому что a[i][j] - это способ, который вы выбираете из двумерного массива. Вы пытались определить long long int *p?

long long int *p 
//... and in the loop 
p=a[i]; 
printf("%lld",p[j]); 

Редактировать: у вас есть достаточное количество ram или swap? Для меня это 80GB.

+1

И сначала я попытался бы с меньшим размером, чтобы избежать проблем с памятью. – jaromrax

+0

, но как компилятор озадачен? – user3201264

+0

@jaramox У меня есть ограничения, поэтому я придерживаюсь этого – user3201264

0

Обратите внимание на определение 2d массива и выделения из его элементов:

#include <stdio.h> 
#include <stdlib.h> 
int main(void) { 
    long long int* a[10][10]; //AS I MENTIONED IN THE COMMENT UNDER THE QUESTION 
    int i, j; 
    for(i=0;i<10;i++) { 
     for(j=0;j<10;j++) { 
      a[i][j] = calloc(sizeof(long long int),10); 
     } 
    } 
    for(i=0;i<10;i++) { 
     for(j=0;j<10;j++) 
      printf("%lld ",a[i][j]); 
      printf("\n"); 
    } 
    return 0; 
} 

А также отметить, что, в зависимости от версии, вы будете пытаться выделить 100000x100000x100000 байт ОЗУ (квадриллионов байт ??).

0

Предполагая, что 2-й фрагмент вы показываете внутри цикла k = 0 до 100000-1 вы не хотите, чтобы обратиться 100000x100000 элементы a внутри этого цикла, как очевидно, только 100000 х k элементы были выделены до сих пор.

Выполнение этой операции приведет к неправильной памяти для всех a[i][j] с j > k, вызвав неопределенное поведение с этим.

Чтобы исправить эту предельную печать на колонке только выделяемой:

#define ARRAY_SIZE (100000) 

... 

long long int * a[ARRAY_SIZE] //Global Declaration 

for (size_z k = 0; k < ARRAY_SIZE; ++k) 
{ 
    a[k] = calloc(sizeof * a[k], ARRAY_SIZE); 
    if (NULL == a[k]) 
    { 
    perror("calloc() failed); 
    exit(1); 
    } 

    for (size_t j = 0; j < ARRAY_SIZE; ++j) 
    { 
    printf("%lld ", a[k][j]); 
    } 

    printf("\n"); 
} 

Изменения:

  • В C заливкой результат malloc() & друзей не надо, и не рекомендуется. Не делай этого.
  • Предпочтительный тип индексирования массивов - size_t.
  • Всегда проверяйте результат всех соответствующих вызовов функций.
  • Не повторяйте себя и не используйте магические числа. Поэтому определите все константы, используя самоочевидные #define s или const s.
Смежные вопросы