使用带有结构数组(及其元素)的strcpy()不起作用

时间:2013-12-06 02:35:05

标签: c arrays string struct malloc

从事家庭作业,但过去2小时一直坚持这个问题。我基本上有一个名为courses的结构。结构定义如下:

typedef struct {
  int crn;
  char course[STR_SIZE];
  char course_number[STR_SIZE];
} courses;

我有一个包含这些结构的动态分配数组,称为courses_array。我还有另一个名为temp_courses_array的临时数组。我正在尝试使用courses_arraytemp_courses_array中的结构内容复制到strcpy()中的结构中;即。 course_number的第i个位置中的courses_array元素应该被复制为course_number的第i个位置中的temp_courses_array元素。出于某种原因,每当我调用strcpy()函数时,相同的四个元素就会被复制到temp_courses_array。这是我的代码(输出在代码下面):

void resize (int **p_size, courses **courses_array)
{
  int i;
  courses *temp_courses_array;
  **p_size = **p_size*2;

  //Initialize the temp array.
  initialize(p_size, &temp_courses_array);

  printf("----------------BEGIN EXPECTED OUTPUT----------------\n");

  for (i = 0; i < ((**p_size)/2); i++)
  {
    printf("%d %s\n", i, ((*courses_array)[i]).course_number);
  }

  printf("----------------BEGIN ACTUAL OUTPUT------------------\n");

  for (i = 0; i < ((**p_size)/2); i++)
  {
    printf("%d %s\n", i, ((*courses_array)[i]).course_number);
    strcpy((temp_courses_array[i]).course_number, ((*courses_array)[i]).course_number);
  }

  free(*courses_array);
  *courses_array = temp_courses_array;   

}//resize()

我不知道为什么会发生这种情况。似乎我通过使用courses_array函数以某种方式修改strcpy() ...这没有任何意义,因为strcpy()应保持原始数组完好无损。我在这个假设中是正确的还是我遗漏了什么?我想另一种选择是将整个结构复制到temp_courses_array而不是每个单独的元素。我不知道怎么做。如果有人能指出我正确的方向,那就太好了。谢谢!

这是输出:

--------------BEGIN EXPECTED OUTPUT----------------
//The first element is the iteration in the loop (i).
0 052
1 123
2 170
3 100B
4 100B
5 106
6 106
7 112
8 136
9 171B
10 171B
11 189C
------------BEGIN ACTUAL OUTPUT---------------
//Notice the repeating elements.
0 052
1 123
2 170
3 100B
4 052
5 123
6 170
7 100B
8 052
9 123
10 170
11 100B

编辑:这是我的initialize()功能:

void initialize(int **p_size, courses **courses_array)
{ 
  *courses_array = (courses *) malloc((**p_size) * sizeof(courses *));
}//initialize()

1 个答案:

答案 0 :(得分:3)

我没有看到任何明显会导致这种情况的事。您应该显示initialize功能。也许你搞乱或重叠两个阵列。

我会回答你问题的第二部分,因为我认为这对你更好:

  

我想另一个选择是将整个结构复制到temp_courses_array而不是每个单独的元素。

是。因为结构是普通旧数据( POD ),所以您可以像任何其他内置类型一样复制它:

for (i = 0; i < ((**p_size)/2); i++)
{
    temp_courses_array[i] = (*courses_array)[i];
}

但是,initialize可能仍然存在问题,因此您仍需要修复它。


请注意,您通常不必执行此无reallocate-copy-free过程。相反,您可以使用realloc来调整内存块的大小,它将处理细节。如果它可以放大块而不复制,它会。如果它需要创建一个新的并复制旧的,它将会。

所以你的功能可以这么简单:

void resize (int **p_size, courses **courses_array)
{
    courses *temp = realloc( *courses_array, **p_size * 2 );
    if( temp ) {
        **p_size *= 2;
        *courses_array = temp;
    }
}

<强>后续

自您发布了initialize功能...

void initialize(int **p_size, courses **courses_array)
{ 
    *courses_array = (courses *) malloc((**p_size) * sizeof(courses *));
}

这是分配一个足够大的数组来容纳一堆指针。使用sizeof(courses)代替sizeof(courses*),它将会修复。目前你正在溢出你的数组(因为你的结构比指针大)并且你得到未定义的行为