共享内存 - 警告:指针和整数之间的比较
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 指针数组。我做错了什么?以上是关于共享内存 - 警告:指针和整数之间的比较的主要内容,如果未能解决你的问题,请参考以下文章