c语言 - 将 strcpy() 与结构(及其元素)数组一起使用不起作用



正在做家庭作业,但在过去的两个小时里一直在解决这个问题。我基本上有一个名为courses的结构。结构定义如下:

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

我有一个动态分配的数组,它包含这些结构,称为courses_array。我还有另一个名为temp_courses_array的临时数组。我正在尝试使用strcpy()courses_array中的结构的内容复制到temp_courses_array中的结构;即courses_array的第i个位置中的course_number元素应被复制为temp_courses_array的第i位置中的course_number元素。出于某种原因,每当我调用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 %sn", i, ((*courses_array)[i]).course_number);
  }
  printf("----------------BEGIN ACTUAL OUTPUT------------------n");
  for (i = 0; i < ((**p_size)/2); i++)
  {
    printf("%d %sn", 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()

我不知道为什么会发生这种事。我似乎在用strcpy()函数修改courses_array。。。这是没有意义的,因为CCD_。我的这个假设是正确的还是遗漏了什么?我想另一种选择是将整个结构复制到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()

我没有看到任何明显的原因。您应该显示您的initialize函数。也许你把两个数组搞砸了或者重叠了。

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

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

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

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

然而,你可能仍然有initialize的问题,所以你仍然需要修复它


请注意,您通常不必执行此重新分配无拷贝过程。相反,您可以使用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*),它会修复。目前,您正在溢出数组(因为您的结构比指针大),并且得到了未定义的行为