【问题标题】:char* from char[] member of structurechar* from char[] 结构成员
【发布时间】:2012-10-24 07:22:10
【问题描述】:

我有一个结构:

typedef struct {
    LogLevel level;
    char message[255];
} LogMessage;

然后我有一个函数接收一个指向 LogMessage 结构的指针,并且需要调用一个接收 char* 的函数:

xStatus = xQueueReceive(xQueueHandleGSMSend, &lReceivedData, portMAX_DELAY);

if(xStatus == pdPASS)
{
    logSimpleMessage(&lReceivedData->message, 1);
}

这里是 logSimpleMessage 函数的原型:

void logSimpleMessage(const char * message, int level);

当我尝试使用上述代码调用它时,我没有得到正确的消息地址(或内容)。如何获得指向 lReceivedData 消息的 char*?

编辑:我已尝试按照建议使用 lReceivedData->message,但我仍然没有得到正确的地址或值。这是 IDE 的屏幕截图...我在调试器中做错了什么吗,因为它似乎应该可以工作。

【问题讨论】:

  • 您期望的价值是多少?我可以在调试器中看到消息字符串是“检查堆栈状态”。logSimpleMessage() 中正在打印/显示什么?

标签: c struct char


【解决方案1】:

而不是

logSimpleMessage(&lReceivedData->message, 1);

你是这么说的:

logSimpleMessage(lReceivedData->message, 1);

【讨论】:

  • 我已经尝试过了,并将屏幕截图附加到问题的结果中,我仍然得到一个不同的地址。
  • 在您的照片中我没有看到邮件的地址。我只看到消息的内容
  • 您确定要通过引用而不是重复指针作为参数传递结构的地址吗?
  • 我如何传递一个重复的指针,而不是结构的地址?
  • 最好粘贴整个代码而不是该图像,以便全局理解它。不然从你说的看不出什么问题。问题出在其他地方。
【解决方案2】:
&lReceivedData->message

产生一个数组的地址。数组会在需要时衰减为指针,因此只需使用:

logSimpleMessage(lReceivedData->message, 1);

您不能真正将数组传递给函数,数组将始终衰减为指向第一个元素的指针。

【讨论】:

  • @Crake:这到底是什么“不正确”的?当您将它作为参数传递时,会创建一个指针。 指针本身当然会有自己的地址,但它会指向数组的第一个元素。
  • 我想我正在查看调试器,以为我传递的是实际地址,而不是指向该地址的新指针。指针的值(在屏幕截图中,在变量窗口中,“testMessage”是函数中的指针)不是数组第一个元素的地址吗?在屏幕截图中,我认为调试器可能正在向我显示指针的地址,然后在消息的指针位置向我显示内存的实际值,而不是能够看到消息的地址。这给了我很好的洞察力,可以继续前进,谢谢。
  • @Crake: 调试器应该显示指针的,即它所指的地址,而不是指针本身的地址我>。但是,您的调试窗口对我来说看起来很奇怪。但是,我可以向您保证,当您将数组传递给函数时,实际传递的是指向其第一个元素的指针。
【解决方案3】:

你只需要将lReceivedData->message传递给函数,去掉&

logSimpleMessage(lReceivedData->message, 1);

char[] 的类型在传递给函数时会衰减为 char*

【讨论】:

  • @Crake:我不确定您要在图像中显示的问题是什么,但这就是您将char[] 传递给期望char* 的函数的方式.您的代码中的其他地方一定存在问题,导致数组未设置为您期望的值。
猜你喜欢
  • 2021-12-09
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 2020-08-14
相关资源
最近更新 更多