Элементы массива, перезаписанные последним в C - PullRequest
0 голосов
/ 24 января 2010

Я пытаюсь создать программу, которая принимает заданное количество строк (пользователя просят ввести количество строк, которые они будут вводить), после того, как у него есть эти строки, они помещаются в массив, используядинамическая память.

Результат будет примерно таким:

# of Strings: 3
Cat
Dog
Elephant 

Cat
Dog
Elephant

Вот фрагмент моего кода после того, как у меня будет количество строк.

sptr=malloc(sizeof(char*)*nStrings);

for(i=0;i<nStrings;i++)
{
    scanf("%s",string);
    length=strlen(string);
    sptr[i]=malloc(sizeof(char)*length);
    sptr[i]=string;
}

Где sptr - массив, к которому я получу доступ для вывода строк.Так что это массив указателей, которые затем указывают на отдельные строки (или другие массивы символов, если вы предпочитаете так думать).

Допустим, есть две строки.Я выделяю память для двух указателей. Затем в первом указателе я сканирую строку, я нахожу длину строки, я выделяю памяти размер строки и равняю указатель на строку.Все это прекрасно работает, и если бы я поместил printf () сразу после этой последней строки, это сработало бы.Проблема, с которой я сталкиваюсь, состоит в том, что если, скажем, есть 3 строки, каждый раз, когда через sptr [i] назначается правильно, но тогда за пределами этого блока все признаки sptr равны = последней строке, которую я вставил,понятия не имею почему.

Если бы вы могли мне помочь, я был бы признателен.Спасибо.

Ответы [ 4 ]

2 голосов
/ 24 января 2010
sptr=malloc(sizeof(char*)*nStrings);

for(i=0;i<nStrings;i++)
{
    scanf("%s",string);
    sptr[i]=strdup(string);
}

Я предполагаю, что строка переменной имеет достаточно памяти для хранения прочитанных строк.

Произошла ошибка, поскольку вы указали указатель на строковую переменную.

1 голос
/ 24 января 2010

Вам нужно выделить 1 дополнительный символ для нулевого терминатора:

sptr[i]=malloc(sizeof(char)*(length+1));

Также вам необходимо скопировать строку во вновь выделенную память:

strcpy(sptr[i], string);
1 голос
/ 24 января 2010

В вашем коде 2 проблемы: вы не выделяете достаточно памяти. Должно быть длиной +1 из-за окончания \ 0 в строке. Во-вторых, вы должны использовать strcpy, чтобы скопировать строку в выделенную память. Найдите функцию strdup, которая обрабатывает оба.

0 голосов
/ 24 января 2010

strlen не учитывает нулевое завершение, вам нужно добавить его. Но в основном вам нужно скопировать строку в выделенную память.

...