Ubuntu警告: 赋值时将指针赋给整数,未作类型转换 [默认启用]

本人在练习时遇到如下警告

在函数‘main’中
警告 赋值时将指针赋给整数,未作类型转换 [默认启用]
警告 赋值时将指针赋给整数,未作类型转换 [默认启用]

代码如下

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SZ 1024                 /* 共享内存的大小 */
#define  TIME_OUT  2

int main(int argc,  char  **argv)
{
  int  shmid;
  key_t  key;
  pid_t  pid;
  int  psm;
  struct shmid_ds  dsbuf;
  if(argc != 2)                     /* 检查命令行参数个数是否正确 */
  {
    printf("arguments error.\n");
    exit(1);
  }
  key = ftok("/home/by-402", 'b');         /* 生成共享内存的键值 */
  if(key < 0)                         /* 如果ftok函数调用失败,输出错误信息并退出*/
  {
    perror("ftok error");
    exit(1) ;
  }
  shmid = shmget(key, SHM_SZ, IPC_CREAT | 0666);         /* 创建一块共享内存 */
  if(shmid < 0)                     /* 如果共享内存创建失败,输出错误信息并退出 */
  {
    perror("shmget error");
    exit(1) ;
  }
  pid = fork();                        /* 创建子进程 */
  if(pid<0)                         /* 如果进程创建失败,输出错误信息并退出 */
  {
    printf("fork error.\n");
    exit(1);
  }
  if(pid==0)                             /* 子进程,向共享内存中写入数据 */
  {
    printf("Child process:\n");
    printf("PID : %d\n", getpid());        /* 输出子进程的标志符 */
    psm = shmat(shmid, NULL, 0);         /* aflect将共享内存映射到进程的地址空间中 */
    if(psm == -1)                         /* 如果映射失败,输出错误信息并退出 */
    {
      perror("shmat error\n");
      exit(1);
    }
    else                                /* 共享内存映射成功 */
    {
      strcpy((char *)psm, argv[1]);  /* 向共享内存中写入数据,这里传入为命令行参数*/
      printf("Send message : %s\n", (char *)psm);
      if((shmdt((void *)psm)) < 0)         /* deflect使共享内存脱离进程的地址空间*/
        perror("shmdt error\n");
      sleep(TIME_OUT);
    }
  }
  else                                 /* 父进程,从共享内存中读取数据 */
  {
    sleep(TIME_OUT);
    printf("Parent process:\n");
    printf("PID : %d\n", getpid());                /* 输出父进程的标志符 */
    if((shmctl(shmid, IPC_STAT, &dsbuf)) < 0)     /* 获取共享内存的状态信息*/
    {
      perror("shmctl error\n");
      exit(1);
    }
    else                                     /* 共享内存的状态信息获取成功 */
    {
      printf("Shared Memory Information:\n");
      printf("\tCreator PID: %d\n", dsbuf.shm_cpid); /* 输出创建共享内存进程的标识符 */
      printf("\tSize(bytes): %d\n",dsbuf.shm_segsz);     /* 输出共享内存的大小 */
      printf("\tLast Operator PID: %d\n",dsbuf.shm_lpid);     
/* 输出上一次操作共享内存进程的标识符 */
      psm = shmat(shmid, NULL, 0);     /* 将共享内存映射到进程的地址空间中 */
      if(psm == -1)                     /* 如果映射失败,输出错误信息并退出 */
      {
        perror("shmat error\n");
        exit(1);
      }
      else                                        /* 共享内存映射成功 */
      {
        printf("Received message : %s\n", (char *)psm);    /* 从共享内存中读取数据 */
        if(shmdt((void *)psm) < 0)             /* 使共享内存脱离进程的地址空间 */
          perror("shmdt error\n");
      }
    }
    if(shmctl(shmid, IPC_RMID, NULL) < 0)         /* 删除前面创建的共享内存 */
    {
      perror("shmctl error\n");
      exit(1);
    }
  }
  return 0;
}


找不出问题在哪,希望有人能解答!