使用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 *resPtr)
{
    resPtr -> id = Ptr1 -> id + Ptr2 -> id;
    resPtr -> salary = Ptr1 -> salary + Ptr2 -> salary;
}

结果是:

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

您应该在存在类似声明的地方包括标准标头stdint.h

此外,您的程序中甚至没有使用第一个typedef。

unsigned char类型的对象的最大值的定义类似于(C标准)

-无符号字符类型的对象的最大值

UCHAR_MAX 255 // 28 − 1

因此,如果要添加100200,则结果将被截断为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,Emp *resPtr )
{
    resPtr -> id = Ptr1 -> id + Ptr2 -> id;
    resPtr -> salary = Ptr1 -> salary + Ptr2 -> salary;
}

程序输出为

300 300