C 函数中使用的结构上的指针

C 函数中使用的结构上的指针,c,pointers,struct,C,Pointers,Struct,在C语言中,指针和结构有一些问题: 我有两个structSignal实体和指针activeSignal来存储其中一个实体。现在,我想在函数printParameters()中使用这个“存储”实体来打印我的结构的值。不幸的是,我的微控制器显示器打印的是一些象形文字,而不是我的值。我必须承认我并没有完全看完指针运算 struct SigParameter { char *name; int value; }; struct Signal { struct SigParameter si

在C语言中,指针和结构有一些问题: 我有两个struct
Signal
实体和指针
activeSignal
来存储其中一个实体。现在,我想在函数
printParameters()
中使用这个“存储”实体来打印我的结构的值。不幸的是,我的微控制器显示器打印的是一些象形文字,而不是我的值。我必须承认我并没有完全看完指针运算

struct SigParameter {
  char *name;
  int value;
};

struct Signal {
  struct SigParameter signalchar;
};

int main(void) {
  struct Signal s1;
  struct Signal s2;
  s1.signalchar.name = "Sinus";
  s2.signalchar.name = "Rect";
  struct Signal *activeSignal = &s1;

  printParameters(activeSignal);
}

void printParameters(struct Signal *s) {
  lcdPrintf(0,11,9,"%s", s->signalchar.name);
}

这里,代码中有一些小错误。我相信这些都是打字错误

  • printParameters()
    没有转发声明
  • main()
    中,调用的函数是
    printParameter()
    ,它应该是
    printParameters()
  • struct SigParameter signalchar
  • 但是,我没有看到使用
    struct Signal*activeSignal=&s1如果您只是想打印值

    您可以检查以下代码

    #include <stdio.h>
    #include <stdlib.h>
    
    
    struct SigParameter {
     char *name;
     int value;
    };
    
     struct Signal {
     struct SigParameter signalchar;
    };
    
    void printParameters(struct Signal s);
    
    int main(void) {
     struct Signal s1;
     struct Signal s2;
     s1.signalchar.name = "Sinus";
     s2.signalchar.name = "Rect";
    
     printParameters(s2);
        return 0;
    }
    
    void printParameters(struct Signal s) {
        printf("%s\n", s.signalchar.name);
    }
    
    #包括
    #包括
    结构参数{
    字符*名称;
    int值;
    };
    结构信号{
    结构SIG参数signalchar;
    };
    无效打印参数(结构信号);
    内部主(空){
    结构信号s1;
    结构信号s2;
    s1.signalchar.name=“窦房结”;
    s2.signalchar.name=“Rect”;
    打印参数(s2);
    返回0;
    }
    无效打印参数(结构信号s){
    printf(“%s\n”,s.signalchar.name);
    }
    
    我使用了simple
    printf()
    代替了您的
    lcdPrintf()
    ,但效果很好

    输出:

    [sourav@broadsword温度]$/a.out

    直肠

    在本文件中,不使用分号。也许这是个错误

    然后,在为字符指针赋值时,必须为该指针分配内存。否则,它将把值存储在寄存器内存中

    s1.signalchar.name = "Sinus";
    s2.signalchar.name = "Rect";
    
    您可以为指针变量分配内存,并在其中执行工作

    然后调用函数

       printParameter(activeSignal);
    
    但功能是,

       printParameters(activeSignal);
    
    #包括
    类型定义结构{
    字符*名称;
    int值;
    }信号参数;
    类型定义结构{
    信号参数信号字符;
    }信号;
    无效打印信号(信号*s);
    内部主(空){
    信号s;
    s、 signalchar.name=“窦房结”;
    打印信号&s;
    返回0;
    }
    打印信号(信号*s){
    printf(“%s”,s->signalchar.name);
    }
    
    这对我来说在gcc-4.8.1上是有效的,所以你的指针算法没有问题。这可能与微控制器的clib有关。为了给出更有用的答案,我们需要知道您使用的是哪个微控制器,我们需要lcdPrintf的定义。

    顺便说一下,typedef可以安全地使用C;-)进行大量键入

    我绝对不是C语言专家,但这对我来说似乎是正确的。如果您将
    s->signalchar.name
    替换为简单的
    “Hello”
    ,它是否正常工作?请与我交流片刻,然后尝试
    printf(“%s”,s->signalchar.name”)。代码在我看来很好;除了
    name
    应该是
    const char*
    的事实之外,如果要为其分配文本,您确定
    lcdPrintf
    工作正常吗?您是否尝试过
    lcdPrintf(0,11,9,“%s”,“Sinus”)?在结构中添加分号。lcdPrintf()可以正常工作。我可以很容易地打印“窦”。分号也不是问题:/您是否考虑过在顶部添加函数原型<代码>无效打印参数(结构信号*s)在结构定义之后,或者可能在
    main
    之前定义函数
    printParameters
    。我认为
    s1.signalchar.name=“窦房结”中没有问题嗯,这只是我代码的摘录。如果我使用printParameters(s2),它可以正常工作。但是我想实现更动态一点,所以我试着用struct@JulianHerbel如何动态?比如更改值和/或内存分配?除此之外,对于任何类型的操作,上述代码都可以正常工作。@JulianHerbel 1)要修改值,只需传递
    &s1
    &s2
    。2) 注意,字符串文本通常是只读的。
       printParameters(activeSignal);
    
    #include <stdio.h>
    typedef struct{
        char *name;
        int value;
    }SignalParameters;
    
    typedef struct{
        SignalParameters signalchar;
    }Signal;
    void printSignal(Signal* s);
    int main(void) {
        Signal s;
        s.signalchar.name = "Sinus";
        printSignal(&s);
        return 0;
    }
    
    printSignal(Signal * s) {
        printf("%s", s->signalchar.name);
    }