gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:06:05 26 4
gpt4 key购买 nike

正在做家庭作业,但在过去的 2 小时里一直被这个问题困住。我基本上有一个名为 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 中的结构; IE。 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 %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()

我不知道为什么会发生这种情况。似乎我正在通过使用 strcpy() 函数以某种方式修改 courses_array...这没有任何意义,因为 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()

最佳答案

我没有看到任何明显的原因。您应该显示您的 initialize 函数。也许您弄乱了两个数组或将其重叠。

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

I guess another option would be to copy the entire struct into the temp_courses_array instead of each individual element.

是的。因为该结构是普通旧数据 (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*) 它将修复。目前您正在溢出您的数组(因为您的结构比指针大)并且您正在获得未定义的行为

关于c - 将 strcpy() 与结构数组(及其元素)一起使用不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20414878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com