使用 C 中的指针运算符将结构传递给函数
Passing structs to a function using the pointer operator in C
在此代码中:
我的结构有 2 个成员,并且定义了 3 个变量。
其中两个的值是我分配的,第三个应该来自函数。
代码:
#include <stdio.h>
#include <stddef.h>
typedef unsigned short int u16; /*2 byte unsigned int*/
typedef unsigned char u8; /*1 byte unsigned char*/
typedef struct
{
u8 id;
u8 salary;
} Emp;
void Math (Emp *Ptr1, Emp *Ptr2, Emp *resPtr);
void main ()
{
Emp Ahmed = {100, 100};
Emp Ali = {200, 200};
Emp Result = {0,0};
Math (&Ahmed, &Ali, &Result);
printf("%d\n%d\n", Result.id, Result.salary);
}
void Math (Emp *Ptr1, Emp *Ptr2, Emp *resPtr)
{
resPtr -> id = Ptr1 -> id + Ptr2 -> id;
resPtr -> salary = Ptr1 -> salary + Ptr2 -> salary;
}
the result is :
44
44
我正在使用 gcc 工具链,我到底哪里出错了?
unsigned char
只能保存最大 255 的值。分配更大的值将导致它被有效地截断为最低 8 位。
将成员的数据类型更改为unsigned short
。然后他们就能拿下结果了。
而不是手动声明这些 typedef
typedef unsigned short int u16; /*2 byte unsigned int*/
typedef unsigned char u8; /*1 byte unsigned char
您应该在存在类似声明的地方加入标准 header stdint.h
。
此外,您的程序中甚至没有使用第一个 typedef。
unsigned char
类型的 object 的最大值定义为(C 标准)
— maximum value for an object of type unsigned char
UCHAR_MAX 255 // 28 − 1
所以如果添加 100
和 200
那么结果将被截断为 44
.
因此您至少应该使用类型 unsigned short
而不是 unsigned char
。
此外,由于前两个参数在函数中未更改,因此应使用限定符 const
.
声明它们
这是一个演示程序。
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
typedef struct
{
uint16_t id;
uint16_t salary;
} Emp;
void Math( const Emp *Ptr1, const Emp *Ptr2, Emp *resPtr );
int main(void)
{
Emp Ahmed = { .id = 100, .salary = 100 };
Emp Ali = { .id = 200, .salary = 200 };
Emp Result = { .id = 0, .salary = 0 };
Math( &Ahmed, &Ali, &Result );
printf("%" PRIu16 "\t%" PRIu16 "\n", Result.id, Result.salary );
return 0;
}
void Math( const Emp *Ptr1, const Emp *Ptr2, Emp *resPtr )
{
resPtr -> id = Ptr1 -> id + Ptr2 -> id;
resPtr -> salary = Ptr1 -> salary + Ptr2 -> salary;
}
程序输出为
300 300
在此代码中:
我的结构有 2 个成员,并且定义了 3 个变量。
其中两个的值是我分配的,第三个应该来自函数。
代码:
#include <stdio.h>
#include <stddef.h>
typedef unsigned short int u16; /*2 byte unsigned int*/
typedef unsigned char u8; /*1 byte unsigned char*/
typedef struct
{
u8 id;
u8 salary;
} Emp;
void Math (Emp *Ptr1, Emp *Ptr2, Emp *resPtr);
void main ()
{
Emp Ahmed = {100, 100};
Emp Ali = {200, 200};
Emp Result = {0,0};
Math (&Ahmed, &Ali, &Result);
printf("%d\n%d\n", Result.id, Result.salary);
}
void Math (Emp *Ptr1, Emp *Ptr2, Emp *resPtr)
{
resPtr -> id = Ptr1 -> id + Ptr2 -> id;
resPtr -> salary = Ptr1 -> salary + Ptr2 -> salary;
}
the result is :
44
44
我正在使用 gcc 工具链,我到底哪里出错了?
unsigned char
只能保存最大 255 的值。分配更大的值将导致它被有效地截断为最低 8 位。
将成员的数据类型更改为unsigned short
。然后他们就能拿下结果了。
而不是手动声明这些 typedef
typedef unsigned short int u16; /*2 byte unsigned int*/
typedef unsigned char u8; /*1 byte unsigned char
您应该在存在类似声明的地方加入标准 header stdint.h
。
此外,您的程序中甚至没有使用第一个 typedef。
unsigned char
类型的 object 的最大值定义为(C 标准)
— maximum value for an object of type unsigned char
UCHAR_MAX 255 // 28 − 1
所以如果添加 100
和 200
那么结果将被截断为 44
.
因此您至少应该使用类型 unsigned short
而不是 unsigned char
。
此外,由于前两个参数在函数中未更改,因此应使用限定符 const
.
这是一个演示程序。
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
typedef struct
{
uint16_t id;
uint16_t salary;
} Emp;
void Math( const Emp *Ptr1, const Emp *Ptr2, Emp *resPtr );
int main(void)
{
Emp Ahmed = { .id = 100, .salary = 100 };
Emp Ali = { .id = 200, .salary = 200 };
Emp Result = { .id = 0, .salary = 0 };
Math( &Ahmed, &Ali, &Result );
printf("%" PRIu16 "\t%" PRIu16 "\n", Result.id, Result.salary );
return 0;
}
void Math( const Emp *Ptr1, const Emp *Ptr2, Emp *resPtr )
{
resPtr -> id = Ptr1 -> id + Ptr2 -> id;
resPtr -> salary = Ptr1 -> salary + Ptr2 -> salary;
}
程序输出为
300 300