2013-02-13 2 views
0

Im пытается сохранить некоторые пользовательские имена в оборванном массиве. Однако во время выполнения я получаю сообщение об ошибке, и я пытаюсь понять, что пошло не так.Хранение строк в оборванном массиве

Мой код:

int num, count, i; 
char *myNames[10]; 

printf("Enter the number of names: "); 
scanf("%d" , &num); 

fflush(stdin); 

    // Ask user to input the name 
for(count = 0 ; count <= num ; count++) 
{ 
    printf("Enter a name: "); 
    scanf("%s" , myNames[count]); 
    fflush(stdin); 
} 

    // To check if names are stored correctly 
printf("%s", *myNames[1]); 

return 0; 
} 

Grateful, если кто-нибудь может поделиться некоторую помощь, или по крайней мере мне точку в правильном направлении. Спасибо

ответ

1

Вам необходимо выделить пространство для самих строк; в настоящее время вы выделяете только массив из 10 указателей, но они никогда не указывают на какую-либо действительную память; следовательно, ошибка, которую вы получаете, когда scanf() пытается записать в них.

Конечно, чтобы выделить нужное количество места для строки, вам нужно знать, сколько символов в строке, что представляет собой немного проблемы с курицей и яйцом; Вы, вероятно, следует использовать один стек распределённая массив, чтобы зсапЕ() писать в и затем strdup(), что, как это:

for(count = 0 ; count <= num ; count++) 
{ 
    printf("Enter a name: "); 
    char temp[1024]; 
    scanf("%s" , temp); 
    myNames[i] = strdup(temp); 
    fflush(stdin); 
} 

... и, конечно, если вы хотите, чтобы ваша программа будет 100% правильно и избегайте утечки памяти, вам нужно будет освободить() каждую из 10 строк перед возвратом, но если это всего лишь игрушечная программа, вы можете это проигнорировать и просто позволить ОС справиться с очисткой.

+0

Обратите внимание, что в этом коде (и в оригинале) вы выделяете 11 строк и помещаете их в массив, длина которого составляет всего 10 и, следовательно, имеет переполнение буфера .... Кроме этого, идеальный ответ! – lnafziger

+0

Выделение строк (num + 1), фактически ... но вы правы, <= в строке for, вероятно, является ошибкой. –

0

char *myNames[10]; создает 10 указателей символов, указывающих на случайное расположение памяти. Когда вы делаете scanf("%s" , myNames[count]);, вы пытаетесь записать в это место памяти, что вызывает нарушение прав доступа. Вам необходимо выделить память для строк, а затем сделать указатели на выделенную память, выполнив что-то вроде этого: myNames[0] = malloc(10);, который выделяет пространство для 10 символов. Обратите внимание, что после завершения обработки вам необходимо освободить память, выполнив free(myNames[0]);.

+0

Спасибо. Таким образом, технические указатели указывают на ячейки памяти, которые могут содержать только 1 символ. Так вот почему я не умею писать строки? – kype

+0

Нет, они указывают на некоторые места памяти мусора, на которые вы не можете читать/писать. Сначала необходимо выделить память, используя функции malloc или аналогичные функции, а затем использовать выделенную ячейку памяти. – Asha

+0

Хорошо спасибо. Угадайте, я должен использовать malloc, тогда .. – kype