移动字符串数组C.

时间:2014-10-23 05:00:21

标签: c pointers c-strings

我正在尝试在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;
}

3 个答案:

答案 0 :(得分: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)++;
  }
}

您需要区分数组中的字符串数和数组的最大大小。

答案 1 :(得分:0)

addItem没问题。

嗯,它的名字很糟糕。

好吧,它依赖别人释放曾经在list[0]中的指针,但似乎不太可能发生这种情况,所以你可能有内存泄漏。

但它没有导致您描述的问题的错误。问题出在其他地方(即在来电者中)。

我认为您反复使用addItem的相同值(指针)调用item。因此,您最终会得到一个数组,其中每个元素都是相同的指针。

答案 2 :(得分:0)

经过一番调查后,我注意到跟踪输入了多少字符串并不是我问题的实际解决方案。我忘记了之前我已经更改了部分代码并且没有编译它。我很抱歉错误地标出了另一个答案。

问题的真正解决方案是字符指针char *item是在main函数中扫描的变量。出于某种原因,char *item是对扫描的字符数组的引用并没有打击我。这意味着list[size-1] = itemlist[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);
}