【问题标题】:Pointer on Struct used in function函数中使用的 Struct 指针
【发布时间】:2014-12-09 13:20:10
【问题描述】:

我在 C 语言中遇到了一些关于指针和结构的问题: 我有 2 个结构体 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);
}

【问题讨论】:

  • 我绝不是 C 专家,但这对我来说似乎是正确的。如果您将s->signalchar.name 替换为简单的"Hello",它是否可以正常工作?
  • 幽默一下,试试printf("%s", s->signalchar.name);。代码对我来说看起来不错;除了 name 应该是 const char* 如果你给它分配文字。
  • 您确定lcdPrintf 工作正常吗?你试过lcdPrintf(0,11,9,"%s", "Sinus");吗?在结构中添加分号。
  • lcdPrintf() 工作正常。我可以轻松打印“鼻窦”。分号也不是问题:/
  • 你有没有考虑在顶部添加函数原型? void printParameters(struct Signal *s); 在结构定义之后或者在main 之前定义函数printParameters

标签: c pointers struct


【解决方案1】:

在这里,您的代码中有一些小错误。我相信这些是错别字。

  1. printParameters() 没有前向声明。
  2. 在您的 main() 中,调用的函数是 printParameter(),应该是 printParameters()
  3. 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);
}

我用简单的printf() 代替了你的lcdPrintf(),但效果很好。

输出:

[sourav@broadsword temp]$ ./a.out

矩形

【讨论】:

  • 好吧,这只是我的代码的摘录。如果我使用 printParameters(s2) 它工作正常。但我想更动态地实现它,所以我用结构上的指针尝试它
  • @JulianHerbel 如何动态?比如改变值和/或内存分配?除此之外,对于任何类型的操作,上述代码应该可以正常工作。
  • @JulianHerbel 1) 修改值,只需传递&amp;s1&amp;s2。 2)注意,字符串文字通常是read-only
【解决方案2】:
struct SigParameter signalchar

在这个分号中没有放置。可能是个错误。

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

s1.signalchar.name = "Sinus";
s2.signalchar.name = "Rect";

您可以为该指针变量分配内存并在其中完成工作。

那你就是调用函数了

   printParameter(activeSignal);

但功能是,

   printParameters(activeSignal);

【讨论】:

  • 好吧,我认为s1.signalchar.name = "Sinus";没有问题
【解决方案3】:
#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);
}

这在 gcc-4.8.1 上对我有用,所以你的指针算法没有问题。它可能与您的微控制器的 clib 有关。为了提供更有用的答案,我们需要知道您使用的是哪个微控制器,并且我们需要 lcdPrintf 的定义。
顺便说一句,typedef 可以确保在 C 中进行大量输入 ;-)。

【讨论】:

    猜你喜欢
    • 2011-08-14
    • 2016-07-12
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多