【问题标题】:Pointer to structure element that is reference to variable指向引用变量的结构元素的指针
【发布时间】:2012-02-04 18:48:21
【问题描述】:

考虑:

struct
{
  char *rcssMonitoredServices;
  int  nSomeVar;
} appinfo;

常规使用:

appinfo.rcssMonitoredServices=strdup("something");

但是现在考虑:

char *RefToStructVar[]=
{
  appinfo.rcssMonitoredServices,
  "\0"
};

目的是我们可以使用 RegToStructVar[0] 指针对 appinfo.rcssMonitoredServices 执行操作。

我在数组中指向变量是有充分理由的。在整数变量的情况下,我们是 A-OK。指向 *char 的指针完全不同。

如果我对 appinfo.nSomeVar 使用相同的技术

int *varpointers[] =
{
    &appinfo.nSomeVar,
    0
};

varpointers[0]=196;
printf("%i",appinfo.nSomeVar) // -> "196"

我认为,鉴于 RefToStructVar[0] 包含指向 appinfo.rcssMonitoredServices 的指针,做类似的事情

RefToStructVar[0]=strdup("something");

将等同于:

appinfo.rcssMonitoredServices=strdup("something");

但是没有。

这个

RefToStructVar[0]=strdup("something");

段错误。

也许是基本的..但现在我很困惑。

--

稍后

以下是段错误:

    struct 
    {
        char *cVar;
        int n;
    } mystruct;

    char *aVars[]=
    {
        mystruct.cVar,
        "\0"
    };

    aVars[0]=strdup("something");

这行得通:

    struct 
    {
        char *cVar;
        int n;
    } mystruct;

    char **aVars[]=
    {
        &mystruct.cVar,
        "\0"
    };

    *aVars[0]=strdup("something");

【问题讨论】:

  • 您的问题过于复杂。你能简单地展示一个段错误的完整例子吗?
  • @cnicutar 编辑成问题。

标签: c pointers structure


【解决方案1】:
RefToStructVar[0]=strdup("something");

不等同于

appinfo.rcssMonitoredServices=strdup("something");

因为虽然这两个指针指向同一个内存,但它们是两个不同的指针,赋值给其中一个不会改变另一个。

此外,除非RefToStructVar 不是数组而是无效指针或其他东西,否则RefToStructVar[0] = anything 绝对没有理由出现段错误。我认为您误诊了崩溃现场。

你说:

我们可以使用 RegToStructVar[0] 指针对 appinfo.rcssMonitoredServices 执行操作。

但是,它不是这样做的。它只是将指针从appinfo 复制到数组中。您可以对字符串进行操作,例如以这种方式更改字符,但如果您分配给其中任何一个,它们就会变得独立。如果你想这样做,你需要一个指向指针的指针:

char** RegToStructVar[] = {
    &appinfo.rcssMonitoredServices
};

【讨论】:

  • 我明白你的意思。我的意图是达到结构变量。指向指针的指针?
  • @MarkRichards 是的,刚刚加入。
  • 这就是票。然后: *RegToStructVar[0]=strdup("something");感谢您的澄清。
  • @MarkRichards 是的,就是这样。
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 2015-09-11
  • 2021-10-15
  • 2012-02-07
相关资源
最近更新 更多