正在做家庭作业,但在过去的两个小时里一直在解决这个问题。我基本上有一个名为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*)
,它会修复。目前,您正在溢出数组(因为您的结构比指针大),并且得到了未定义的行为。