2014-10-23 3 views
0

Я пытаюсь создать функцию в C, которая перемещает все элементы (строки) вверх в массив и вставляет строку в конец. По какой-то причине, хотя созданная мной функция заставляет все элементы массива иметь одинаковое значение (значение, которое я вставляю). Я не уверен, что я сделал неправильно.Перемещение массива строк C

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

Любая помощь была бы принята с благодарностью.

void addItem(char **list, char *item, int size){ 
    int i; 

    // loop through the list and move everthing up 
    for(i=0; i<size-1; i++){ 
     // move items up until we are at the last item 
     list[i] = list[i+1]; 
    } 
    // set the last item 
    list[size-1] = item; 
} 
+0

аргументы, которые вы передаете этой функции, как они распределены? размер размера массива или количество элементов в массиве? –

+0

список выделяется во время выполнения основной функции, а затем все элементы имеют значение NULL. Строка, добавляемая, берется из ввода пользователя. – tiantang

+0

Опять же, как распределяется строка? Проблема в вызывающем. – ikegami

ответ

0

После некоторого расследования я заметил, что отслеживание того, сколько строк было введено, не было фактическим решением моей проблемы. Я забыл, что до этого я изменил часть кода и не скомпилировал его. Прошу прощения за ложное обозначение другого ответа.

Реальное решение проблемы заключается в том, что указатель на символ char *item является переменной, отсканированной в основной функции. По какой-то причине меня не поразило, что char *item является ссылкой на массив символов, отсканированный. Это означает, что list[size-1] = item устанавливает list[size-1] в ячейку памяти char *item. Таким образом, в основном со временем list в любой позиции указывает на то же место памяти. Таким образом, в минуту, когда char *item изменяет основную функцию, он делает все элементы list равными этому значению ... Простая ошибка указателя превратилась в катастрофу.

Это рабочий код, который использует strcpy(), malloc() and free() для надлежащего решения этой проблемы. Элементы массива char **list установлены в NULL в основной функции, чтобы обеспечить удаление мусора.

void shiftInsert(char **list, char *item, int size){ 
    int i; 

    // loop through the list and move everthing up 
    for(i=(size-1); i>=0; i--){ 

     list[i] = list[i-1]; 
    } 

    // clear our first item and allocate it 
    free(list[0]); 
    list[0] = (char *)malloc(sizeof(item)); 

    // set the last item 
    strcpy(list[0], item); 
} 
0

addItem - штраф.

Ну, у него есть ужасное имя для того, что он делает.

Ну, это полагается на кого-то другого, освобождающего указатель, который раньше находился в list[0], но кажется маловероятным, что это происходит, поэтому у вас, вероятно, есть утечка памяти.

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

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

1

Вот предложение, как вы можете сделать это

void addItem(char **list, char* item, int* count, int size) 
{ 
    int i = 0; 
    if (*count == size) 
    { 
    for (i = 0; i < size-1; ++i) 
    { 
     list[i] = list[i+1]; 
    } 
    list[size-1] = item; 
    } 
    else 
    { 
    list[*count] = item; 
    (*count)++; 
    } 
} 

Вы должны отличаться от числа строк в массиве и максимальный размер массива.

+0

другим способом было бы сохранить порядок обратного смещения вправо и присвоить новый элемент 0-му индексу. – qwr

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