【问题标题】:Incompatible pointer type when I want to refer to a struct variable当我想引用结构变量时,指针类型不兼容
【发布时间】:2021-02-01 19:36:54
【问题描述】:

我正在尝试使用函数迭代结构的变量。当我给出指针的起始地址时,我收到一条警告:“从不兼容的指针类型 [-Wincompatible-pointer-types] 初始化”。当我将此指针添加到函数时,我收到另一个警告:“从不兼容的指针类型 [-Wincompatible-pointer-types] 传递‘ManipulateMessage’的参数 1”。我已经搜索了这些错误,但结果对我没有帮助。该代码实际上正在运行,但我想避免未定义的行为。这个简单代码最简洁的方式是什么?

#include  <stdio.h>
#include  <stdlib.h>

/*************************************************
include
**************************************************/
//A message structure
typedef struct SIGNAL_STRUCTURE
{
    int name;
    int manipstarttime;
} signal_structure;

//Structure what collects all the signals 
typedef struct SIGNAL_COLLECTOR
{
    signal_structure EngSpeed;
    signal_structure TransReqGear;
    signal_structure CurrentGear;
} signal_collector;

//Function to do with the above structure
void ManipulateMessage(signal_structure * signal)
{
    signal->name = 10;
    signal->manipstarttime = 11;
}

/*************************************************
main
**************************************************/
void fcn(signal_collector * param_signal, int len)
{
    int *pointer = param_signal;
    
    while(len--)
    {
        printf("pointer: %p\n", pointer);
        ManipulateMessage(pointer);
        pointer += (sizeof(signal_structure) / sizeof(int));
    }
}

int main(void)
{
    signal_collector dummy;
    fcn(&dummy, 2); 
    return 0;
}

【问题讨论】:

  • 你为什么要把signal_structure *当作int *
  • int *pointer 替换为signal_structure *pointer,将pointer += (sizeof(signal_structure) / sizeof(int)); 替换为pointer++;
  • fcn() 期望参数是signal_collector 结构的数组。您传递了一个signal_collector,但告诉它len 参数中有两个。
  • 另外,while (len--) 将迭代 3 次,而不是 2 次。 while (--len) 将迭代 2 次。
  • @AndrewHenle 类似的东西。但我可能会改用size_t i... :)

标签: c pointers


【解决方案1】:

fcn() 你得到signal_collector * param_signal,但在第二行你说 int *pointer = param_signal;。所以你将signal_collector 转换为int,然后将pointer 类型为int * 发送到ManipulateMessage(),它期望signal_structure * 作为参数。

你看到问题了吗?为了解决此问题,请将fcn() 中的第二行更改为:

signal_collector *pointer = param_signal;

【讨论】:

  • 另外,需要更改指针增量。
  • 谢谢你的回答,我以为指针只包含一个内存段的地址,所以它应该是一个数字变量,就像一个整数。看来我需要更多的作业来处理指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
相关资源
最近更新 更多