共享内存 - 警告:指针和整数之间的比较

Posted

技术标签:

【中文标题】共享内存 - 警告:指针和整数之间的比较【英文标题】:Shared Memory - Warning: Comparison Between Pointer and Integer 【发布时间】:2017-10-10 21:45:49 【问题描述】:

我正在做一个学校项目,一切正常,但在编译时我收到警告“指针和整数之间的比较”。谁能解释为什么会这样?我在下面的所有四个共享内存初始化中都收到了相同的警告。我尝试了不同的方法进行比较。据我所知, shmget 和 shmat 应该在错误时返回 -1。即使出现警告,代码也运行良好。我已进行更改以提示错误。这些警告在 shmat 行上提示。下面列出的最小代码。

//--------------------------------------------------
//Variables
//--------------------------------------------------

//Shared memory variables
int (*clockVar)[2];
int *turn;
int (*shmMsg)[2];
enum state idle, want_in, in_cs, done, dne *flag;
long *pidList;

//Shared memory keys
key_t clockKey;
key_t turnKey;
key_t msgKey;
key_t flagKey;
key_t pidKey;

//Shared memory IDs
int clockID = 0;
int turnID = 0;
int msgID = 0;
int flagID = 0;
int pidID = 0;
//--------------------------------------------------
//Key Initialization
//--------------------------------------------------

clockKey = ftok("ftok_clock", 13);
if (clockKey == -1)
    perror("Clock: Failed to load ftok file");
    return 1;


msgKey = ftok("ftok_msg", 17);
if (msgKey == -1)
    perror("Message: Failed to load ftok file");
    return 1;


flagKey = ftok("ftok_flag", 15);
if (flagKey == -1)
    perror("Flag: Failed to load ftok file");
    return 1;


pidKey = ftok("ftok_pids", 17);
if (pidKey == -1)
    perror("PID: Failed to load ftok file");
    return 1;


//--------------------------------------------------
//Shared Memory Initialization
//--------------------------------------------------

//Initializing shared memory for clock counter
clockID = shmget(clockKey, sizeof(int[2][1]), IPC_CREAT | 0666);
if (clockID == -1)
    perror("Clock: Failed to designate shared memory");
    return 1;


clockVar = shmat(clockID, 0, 0);
if (clockVar == (int*)-1)
    perror("Clock: Failed to attach shared memory");
    return 1;


//Initializing shared memory for the Message array
msgID = shmget(msgKey, sizeof(int[2][1]), IPC_CREAT | 0666);
if (msgID == -1)
    perror("Message: Failed to designate shared memory");
    return 1;


shmMsg = shmat(msgID, NULL, 0);
if (shmMsg == (int*)-1)
    perror("Message: Failed to attach shared memory");
    return 1;


//Initializing shared memory for flag counter
flagID = shmget(flagKey, sizeof(enum state[maxProc]), IPC_CREAT |  0666);
if (flagID == -1)
    perror("Flag: Failed to designate shared memory");
    return 1;


flag = shmat(flagID, NULL, 0);
if (flag == (enum state*)-1)
    perror("Flag: Failed to attach shared memory");
    return 1;


//Initializing shared memory for the process count array
pidID = shmget(pidKey, sizeof(int), IPC_CREAT | 0666);
if (pidID == -1)
    perror("PID: Failed to designate shared memory");
    return 1;


pidList = shmat(pidID, NULL, 0);
if (pidList == (int*)-1)
    return 1;

编辑:进行了建议的编辑。标志比较不再抛出错误(枚举状态*)。现在我收到警告:不同指针类型的比较缺少其他三个(clockVar、shmMsg 和 pidList)的强制转换。我还在顶部添加了我的声明。我确定我只是在这里弄乱了一些语法。谢谢!

【问题讨论】:

shmget 返回一个 int .. 你的 *ID 变量是什么类型的? 我添加了上面的变量并实现(可能不正确)Felix 建议的更改。添加注释。 【参考方案1】:

shmat() 返回一个指针,您将它与一个整数进行比较。见shmat() manpage:

成功时shmat()返回附加的共享内存段的地址;返回错误(void *) -1

像这样更改您的代码(假设您未在问题中显示的变量声明具有正确的类型,在本例中为 void *shmMsg;):

// [...]
shmMsg = shmat(msgID, NULL, 0);
if (shmMsg == (void*) -1)
    //[...]

你应该没事的。

【讨论】:

我编辑了上面的代码以尝试实现这一点,它适用于枚举,但不适用于 int 指针数组。我做错了什么?

以上是关于共享内存 - 警告:指针和整数之间的比较的主要内容,如果未能解决你的问题,请参考以下文章

fork(),C 中的共享内存和指针

进程间通信方式——共享内存

简单地将整数存储在共享内存段中:C

boost::interprocess 32 位和 64 位进程之间的共享内存

将函数指针保存在共享内存中

与struct和malloc共享内存fork