2015-10-14 5 views
1

У меня есть такие программы, как это,C Программа - Как инициализировать Long Размер массива

Программа 1

#include <stdio.h> 
#include <string.h> 

#define ARRAY_SIZE 0x320204 

int main() 
{ 
    unsigned long long_array[ARRAY_SIZE]; 

    memset (long_array, 0, ARRAY_SIZE); 

    return 0; 
} 

Программа 2

#include <stdio.h> 
#include <string.h> 

#define ARRAY_SIZE 0x320204 

int main() 
{ 
    unsigned long long_array[ARRAY_SIZE] = {0}; 

    //memset (long_array, 0, ARRAY_SIZE); 

    return 0; 
} 

Обе программы дают Ошибка сегментации.

Просьба пояснить, как инициализировать этот массив длинного размера. Заранее спасибо.

+2

код, вероятно, попадет ограничение размера стеки при попытке выделить этот «огромный» массив. – alk

+0

Этот «* memset (long_array, 0, ARRAY_SIZE);« * »скорее всего не будет делать то, что вы ожидаете (но мало). – alk

+0

Очень похожий вопрос был здесь как 10 минут назад ... –

ответ

4

Ошибка сегментации заключается в том, что вы пытаетесь выделить в стеке 0x320204long s, что может быть слишком большим. В десятичной форме это 3277316 * sizeof(unsigned long), что на моей машине 3277316 * 8 = 26218528 байт, то есть около 25 Мбайт.

Второй способ инициализации - наиболее распространенный, он будет обнулять все элементы. Первый метод будет только нулевым первым ARRAY_SIZE байтами, но помните, что sizeof(unsigned long) обычно составляет 8 байт, поэтому вам нужно указать sizeof(unsigned long) * ARRAY_SIZE байт.

+1

Вместо «нужно обнулить байты' 8 * ARRAY_SIZE' », предложите« нулевое значение 'sizeof (unsigned long long) * ARRAY_SIZE' bytes "или" необходимо обнулить байты sizeof long_array ". Таким образом, избегайте магических чисел, таких как 8. – chux

+0

@chux Полностью согласен, отредактирован. – vsoftco

+1

Отредактировано, OP использует 'long' (не' long long') –

0

Что вы можете сделать, это использовать calloc, что является лишь одним вызовом, более понятным для многих людей, хотя это и не очень важно, и использует кучу, что является самым большим преимуществом. Когда вы захотите создать действительно большой массив (или объекты или что-то еще), куча - это место для вас. В конечном счете использование стека для такого рода материалов нецелесообразно и, вероятно, вызовет ошибку stackoverflow. Кроме того, вы можете передать этот указатель, возвращенный с calloc, на что угодно, чтобы беспокоиться о том, что произойдет с выделенной памятью. Это не похоже на стек, где он, вероятно, будет перезаписан, как только эта функция вернется, что-то, что случилось со мной много раз, создавая ошибки, которые трудно исправить. Тем не менее, есть минусы calloc, как и тот факт, что он довольно медленный, но так же быстро, как и memset. Но если вам не нужно, чтобы все биты были установлены в 0, вы могли бы использовать malloc (гораздо быстрее и популярнее). Второй недостаток - calloc или malloc - то, что вы должны называть указатели free, иначе вы пропустите память. Вот как использовать calloc:

#include <stdlib.h> // or "#include <cstdlib>" in C++ 


/* Allocate space for array, set all bytes to 0, 
    and return pointer. Then assign to long_array. 
*/ 
unsigned long* long_array = (unsigned long*) calloc(ARRAY_SIZE); 
// When you're done with this variable: 
free(long_array); 

просто. И calloc, и malloc сделаны для такого рода вещей. Надеюсь, это помогло!

Примечания: Хотя эти ссылки на сайт C++, вы можете использовать эти функции в чистом C, включив в <stdlib.h>