在函数中传递参数以将结构值转换为数组
Passing an argument in the function to turn struct values into an array
我将函数 void Assign_numbers
传递给了 void Adding
。当我将其更改为指针并编译它时,第一个数组值 returns 与 void Assign_numbers
中 number.a
的值相同。数组中从 ptr[1]
开始的另一个值给出了一个完全不同的数字。你能帮我一下吗,这样数组就可以输出其他分配的数字了。请不要更改格式。
#include <stdlib.h>
#include <stdio.h>
#define Max 6
struct Numbers
{
double a,b,c,d,e,f;
};
void Adding(struct Numbers *ptr)
void Assign_numbers()
{
struct Numbers number;
number.a=45.78;
number.b=81.45;
number.c=56.69;
number.d=34.58;
number.e=23.57;
number.f=78.35;
Adding(&number);
}
void Adding(struct Numbers *ptr)
{
int i =0;
for(i;i<Max;i++)
{
ptr[i];
printf("%.2f\n",ptr[i]);
}
}
int main()
{
Assign_numbers();
return 0;
}
在Adding
函数中,变量ptr
指向一个单一结构,本质上是一个单一元素的数组。当你这样做时ptr[1]
您尝试访问此单元素数组中的 second 元素,这超出了范围,将导致 未定义的行为 .
根本无法像对待数组一样对待标准 C 中的结构。
虽然有 hacks。例如,使用一个联合结构作为一个成员,一个数组作为另一个成员,但这依赖于编译器不在结构成员之间添加任何填充。既不便携也不推荐。
指针的类型(在您的例子中是 struct Numbers
)定义了数组中元素的偏移量。例如,如果您有某种类型的数组 T
使用 a[i]
将意味着 从地址 a + i * sizeof(T)
获取 T
的值或更简单。
注意:实际上 a[i]
会转换为 *(a + i)
,这就是 i[a]
工作正常的原因。请参阅 With arrays, why is it the case that a[5] == 5[a]? 问题。
现在你有 struct Numbers *ptr
并使用 ptr[0]
使其成为 *(ptr + 0 * sizeof(struct Numbers))
,这将引导你进入记忆中的结构。然而,使用 ptr[1]
会导致您进入 *(ptr + 1 * sizeof(struct Numbers))
,但内存中此地址上没有数据,这会导致未定义的行为。
你想要做的是用 double*
遍历你的结构,例如
void Assign_numbers()
{
struct Numbers number;
number.a=45.78;
number.b=81.45;
number.c=56.69;
number.d=34.58;
number.e=23.57;
number.f=78.35;
Adding((double*)&number);
}
void Adding(double* ptr)
{
int i = 0;
for(i; i < Max; i++)
{
ptr[i];
printf("%.2f\n",ptr[i]);
}
}
打印
45.78
81.45
56.69
34.58
23.57
78.35
另一种方法是使用union
。例如,参见 C method for iterating through a struct's members like an array?。
我将函数 void Assign_numbers
传递给了 void Adding
。当我将其更改为指针并编译它时,第一个数组值 returns 与 void Assign_numbers
中 number.a
的值相同。数组中从 ptr[1]
开始的另一个值给出了一个完全不同的数字。你能帮我一下吗,这样数组就可以输出其他分配的数字了。请不要更改格式。
#include <stdlib.h>
#include <stdio.h>
#define Max 6
struct Numbers
{
double a,b,c,d,e,f;
};
void Adding(struct Numbers *ptr)
void Assign_numbers()
{
struct Numbers number;
number.a=45.78;
number.b=81.45;
number.c=56.69;
number.d=34.58;
number.e=23.57;
number.f=78.35;
Adding(&number);
}
void Adding(struct Numbers *ptr)
{
int i =0;
for(i;i<Max;i++)
{
ptr[i];
printf("%.2f\n",ptr[i]);
}
}
int main()
{
Assign_numbers();
return 0;
}
在Adding
函数中,变量ptr
指向一个单一结构,本质上是一个单一元素的数组。当你这样做时ptr[1]
您尝试访问此单元素数组中的 second 元素,这超出了范围,将导致 未定义的行为 .
根本无法像对待数组一样对待标准 C 中的结构。
虽然有 hacks。例如,使用一个联合结构作为一个成员,一个数组作为另一个成员,但这依赖于编译器不在结构成员之间添加任何填充。既不便携也不推荐。
指针的类型(在您的例子中是 struct Numbers
)定义了数组中元素的偏移量。例如,如果您有某种类型的数组 T
使用 a[i]
将意味着 从地址 a + i * sizeof(T)
获取 T
的值或更简单。
注意:实际上 a[i]
会转换为 *(a + i)
,这就是 i[a]
工作正常的原因。请参阅 With arrays, why is it the case that a[5] == 5[a]? 问题。
现在你有 struct Numbers *ptr
并使用 ptr[0]
使其成为 *(ptr + 0 * sizeof(struct Numbers))
,这将引导你进入记忆中的结构。然而,使用 ptr[1]
会导致您进入 *(ptr + 1 * sizeof(struct Numbers))
,但内存中此地址上没有数据,这会导致未定义的行为。
你想要做的是用 double*
遍历你的结构,例如
void Assign_numbers()
{
struct Numbers number;
number.a=45.78;
number.b=81.45;
number.c=56.69;
number.d=34.58;
number.e=23.57;
number.f=78.35;
Adding((double*)&number);
}
void Adding(double* ptr)
{
int i = 0;
for(i; i < Max; i++)
{
ptr[i];
printf("%.2f\n",ptr[i]);
}
}
打印
45.78
81.45
56.69
34.58
23.57
78.35
另一种方法是使用union
。例如,参见 C method for iterating through a struct's members like an array?。