从事家庭作业,但过去2小时一直坚持这个问题。我基本上有一个名为courses
的结构。结构定义如下:
typedef struct {
int crn;
char course[STR_SIZE];
char course_number[STR_SIZE];
} courses;
我有一个包含这些结构的动态分配数组,称为courses_array
。我还有另一个名为temp_courses_array
的临时数组。我正在尝试使用courses_array
将temp_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()
答案 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*)
,它将会修复。目前你正在溢出你的数组(因为你的结构比指针大)并且你得到未定义的行为。