【问题标题】:Can't pass typedef struct to function by reference无法通过引用将 typedef 结构传递给函数
【发布时间】:2017-12-19 23:26:23
【问题描述】:

我试图通过引用将自定义类型对象传递给函数,但我不知道我可能做错了什么。我阅读了How do you pass a typedef struct to a function? 以及其他参考资料,并且可以发誓我已经在这样做了。我清除了我正在做的所有其他事情,甚至这个斯巴达代码也会引发 5 个错误。帮助我,Stackexchange;你是我唯一的希望!

目标只是能够改变对象中数组中的值。

#include <stdio.h>
#include <math.h>
typedef struct structure {
    char byte[10];
    char mod;
} complex;
void simpleInit (complex *a, char value) {//put the value in the first byte and zero the rest
    a.byte[0] = value;
    char i;
    for (i = 1; i < 10; ++i) {
        a.byte[i] = 0;
    }
    a.mod = 1;
}
void main () {
    complex myNumber;
    char value = 6;
    simpleInit (myNumber, value);
}

当我尝试运行它时,我得到了这个错误和 4 个类似的错误:

test2.c:10:3: 错误:在不是结构或联合的东西中请求成员“字节”

a.byte[0] = 值;

【问题讨论】:

  • a.byte --> a-&gt;byte
  • simpleInit 期望 complex * 作为其第一个参数。 myNumber 的类型为 complex,而不是 complex *。您需要将&amp;myNumber 传递给simpleInit。它与typedef 无关。这适用于任何基本的 C 数据类型。
  • 你需要学习语言

标签: c arrays reference typedef


【解决方案1】:

a 是指针类型,所以需要取消引用才能使用。通常这是使用箭头运算符完成的:

a->byte[i] = 0;

由于这只是一个字节数组,您也可以快速将其“归零”:

memset(a, 0, 10);

尽管考虑到10 在您的代码中的重要性,您应该将其编码为常量或#define

【讨论】:

  • 或者使用sizeof(a-&gt;byte),尽管循环索引需要是无符号类型(例如size_t)以避免有符号-无符号比较警告(如果已启用)。
  • 我的实际代码确实使用了#define,但也不是 10。这只是我正在制作的用于处理大于 64 位的数字的大规模缩小版本(如自制的 mini-gmp)。我也会从 memset 函数中得到很多用处,谢谢。正如 Tom Karzes 在评论中指出的那样,我也未能通过 & 传递引用。
  • 如果您要初始化更大的数组,memset 将成为救命稻草。这比逐字节设置更有效。
【解决方案2】:

当您通过引用传递值时,您需要使用星号来访问结构的所有字段,例如:

(*a).byte[0] = value;

很高兴你有 -> 作为快捷方式,所以这将是:

a->byte[0] = value;

当您调用simpleInit 时,不要忘记调用&(地址)运算符。

#include <stdio.h>
#include <math.h>

typedef struct structure 
{
    char byte[10];
    char mod;
} complex;

void simpleInit (complex *a, char value) 
{
    char i;

    a->byte[0] = value;

    for (i = 1; i < 10; ++i) {
        a->byte[i] = 0;
    }

    a->mod = 1;
}

int main() 
{ 
    complex myNumber;
    char value = 6;
    simpleInit (&myNumber, value);
}

【讨论】:

  • 谢谢你这是完美的。我已经接受了另一个完美的答案,但是您的答案与我更正的代码完全相同。 :) 我花了几个小时试图弄清楚这一点!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2018-01-18
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多