Ошибка сегментации в scanf

Во время выполнения этого кода я сталкиваюсь с ошибкой сегментации в scanf (). Возможно, это связано с объявлением больших массивов (я проверил его, комментируя объявление массивов).

#include int main() { int test; //int n,ok,counter,i,j; char a[1000][1000]; int x[1000][1000],y[1000][1000]; scanf("%d",&test); printf("%d",test); return 0; } 

Так как мне нужны эти массивы, может кто-то подскажет мне, как корректировать этот код.

Проблема в том, что вы определяете некоторые огромные объекты локально. Локальные переменные создаются в стеке, и у стека есть ограничения (на stream). Иногда стек может быть не более 1 мегабайта. Ваши массивы будут намного выше этого. Я предполагаю, что вы на самом деле переполняете стек. Вы можете перенести определения массива за пределы основного, и ваша программа должна работать, поскольку эти массивы не будут созданы в стеке. Вы также можете определить свои массивы, сделав их static в main . Это имеет тот же эффект, что и объявление их снаружи.

Глобально определенные переменные (включая неинициализированные массивы) и static неинициализированные переменные (даже если они находятся в функции) обычно помещаются в сегмент данных и инициализируются при запуске вашей программы. Они также могут быть установлены на все 0. Эта ссылка на Wiki описывает эту область данных в C как:

BSS в C

В C статически распределенные объекты без явного инициализатора инициализируются нулем (для арифметических типов) или нулевым указателем (для типов указателей). Реализации C обычно представляют собой нулевые значения и значения нулевого указателя, используя битовый шаблон, состоящий исключительно из нулевых битов (хотя это не требуется стандартом C). Следовательно, раздел BSS обычно включает в себя все неинициализированные переменные, объявленные в области файлов (то есть вне любой функции), а также неинициализированные локальные переменные, объявленные с ключевым словом static. Реализация также может назначать статически распределенные переменные, инициализированные значением, состоящим исключительно из нулевых битов в раздел bss.

Сегмент BSS не ограничен, как стек. BSS может использовать до доступной памяти, если ресурсы существуют, и вы не превышаете квоты процесса.

Другой альтернативой является динамическое распределение массивов с помощью malloc которые помещают их в кучу. Следующий код будет самым простым способом создания ваших массивов. Я использовал #define чтобы прояснить, что такое строка и столбец. После того, как эти массивы определены и выделена память, они могут использоваться как любой нормальный 2D-массив.

 #include #include int main() { #define ROWS 1000 #define COLUMNS 1000 int test; char (*a)[COLUMNS] = malloc(ROWS * sizeof *a); int (*x)[COLUMNS] = malloc(ROWS * sizeof *x); int (*y)[COLUMNS] = malloc(ROWS * sizeof *y); a[100][20] = 'X'; x[4][999] = 666; y[500][0] = 42; scanf("%d",&test); printf("%d",test); free(a); free(x); free(y); return 0; } 

Вы выделяете огромную память в стеке, и это вызывает stackoverflow! Вы должны использовать malloc() для таких случаев, он будет выделять память в кучу. Также вам нужно free() память после использования.

Это пример кода, который вы можете использовать, я только сделал это для переменной, вы можете использовать аналогичный код для своей переменной x и y :

 #include #include int main() { char **a; int i, j; a = malloc(1000*sizeof(char*)); for(i=0;i<1000;i++) { a[i] = malloc(1000*sizeof(char)); for(j = 0; j < 1000; j++) { //Your operations } } for(i=0; i< 1000; i++) free( a[i]); free(a); return 0; }