2015-02-16 2 views
0

Скажем, мне нужен массив слов с максимальной длиной 20. Я получаю количество слов, которое нужно сохранить из пользовательского ввода. Каков наиболее эффективный способ записи объявленного массива?Объявление 2-мерного массива с размером в соответствии с вводом

Я мог бы сделать что-то подобное, но я думаю, что это не очень эффективная память?

char wordArray[1000][20]; 

То есть я хочу, чтобы «1000» варьировалось в зависимости от ввода пользователя. И я не могу этого сделать.

int main() 
{ 
    int size; 
    printf("Enter size: "); 
    scanf("%d", &size); 
    char wordArray[size][20]; 
} 
+0

Я боюсь, что мы собираемся нужно больше информации здесь. Какой вход? Является ли размер ввода известным заранее * во время выполнения * (я знаю, что это не во время компиляции)? –

+3

Я думаю, вам нужно «malloc» – Coconop

+0

[как это] (http://stackoverflow.com/questions/7871081/how-to-declare-an-array-with-an-arbitrary-size) –

ответ

4

Как правило, размер стека небольшой, и вы не можете выделить такой большой объем памяти в стеке. Это приведет к переполнению стека. Вам нужно динамическое распределение.

int size; 
printf("Enter size: "); 
scanf("%d", &size); 
char **wordArray = malloc(size*sizeof(char *)); 

for(int i = 0; i < size; i++) 
    wordArray[i] = malloc(20); 

Позвоните free, чтобы освободить.

Но обратите внимание, что это будет выделять дефрагментированную память вместо непрерывной, в отличие от 2D-массива. Для того, чтобы получить непрерывное выделение памяти вы можете использовать указатель на массив в качестве

int (*wordArray)[20] = malloc(size * sizeof(*wordArray)); 

и доступ к элементу в wordArray[i][j].

Для более подробного объяснения чтения c-faq 16.6: How can I dynamically allocate a multidimensional array?

+1

Убей меня :) Используйте malloc. И не забывайте ** free() ** ваш wordArray, когда закончите с этим. –

+0

Немой вопрос, но: зачем нужно указывать указатель на указатель на char здесь вместо простого указателя на char? – Unheilig

+1

@Unheilig; Для достижения эффекта двухмерного массива. – haccks

2

Нет, это не так, потому что вы устанавливающее распределение 100000 раз sizeof(char) памяти. И нет, вы не можете делать так, как вы писали здесь, потому что во время компиляции размер массива неизвестен, поэтому пространство не может быть выделено. Вы можете сделать это, используя malloc.

+0

Он мог сделать это, как писал там в C99, * BUT * (и это большой «но»), он подвержен переполнениям стека и т. Д. --- так, это было бы плохой идеей. –

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