【问题标题】:How to fix " assignment makes pointer from integer without a cast [-Wint-conversion]"? C unix program如何修复“赋值使指针从整数而不进行强制转换 [-Wint-conversion]”? C unix程序
【发布时间】:2019-11-02 01:43:44
【问题描述】:

我正在编写这 2 个程序,但收到以下警告:“赋值从整数中生成指针而无需强制转换 [-Wint-conversion]”。

我正在尝试将这些程序编译到其他机器上,但我收到了同样的问题。 我能做什么?

//PROGRAM 1  (PRODUCTOR)

#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <stdio.h>

#define SHMEMSIZE 4096

int main()
{

    key_t key_mem=6868;
    key_t key_sem=3232;
    int id_mem;
    int id_sem;
    void *addr_mem;
    struct sembuf param[1];

    if(id_mem = shmget(key_mem,SHMEMSIZE,0) == -1)
    {
        printf("Errore1\n");
        return -1;
    }


    if(addr_mem =shmat(id_mem,NULL,0) == (void *)-1)
    {
        printf("Errore2\n");
        return -1;
    }

    if(id_sem = semget(key_sem,2,0)== -1)
    {   
        perror("Errore3\n");
        shmdt(addr_mem);
        return -1;
    }

    while(1)
    {
        param[0].sem_num=1;
        param[0].sem_op=-1;
        param[0].sem_flg=0;

        if(semop(id_sem,param,1)==-1)
        {
            printf("Errore6\n");
            return -1;
        }
        printf("Scrivi messaggio: ");
        if(scanf("%[^\n]", (char *)addr_mem) == 0)
             *((char *)addr_mem) = '\0';
        getc(stdin);

        param[0].sem_num=0;
        param[0].sem_op=1;
        param[0].sem_flg=0;
        if(semop(id_sem,param,1)==-1)
        {
            printf("Errore7\n");
            return -1;
        }
    }

    shmdt(addr_mem);

}






_____________________________________________________

//PROGRAM 2 (CONSUMER)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <stdio.h>
#define SHMEMSIZE 4096

union semun 
{
    int val;
    struct semid_ds *buf;
    unsigned short *array;
    struct seminfo *__buf;
};

int main()
{

    key_t key_mem=6868;
    key_t key_sem=3232;
    int id_mem;
    int id_sem;
    void *addr_mem;

    union semun arg;
    struct sembuf param[1];

    if(id_mem = shmget(key_mem,SHMEMSIZE,IPC_CREAT|0666) == -1)
    {
        printf("Errore1");
        return -1;
    }

    if(addr_mem =shmat(id_mem,NULL,0) == (void *)-1)
    {
        printf("Errore2");
        shmctl(id_mem, IPC_RMID, NULL);
        return -1;
    }

    if(id_sem = semget(key_sem,2,IPC_CREAT|0666)== -1)
    {   
        printf("Errore3");
        shmctl(id_mem, IPC_RMID, NULL);
        shmdt(addr_mem);
        return -1;
    }

    arg.val=0;
    if(semctl(id_sem,0,SETVAL,arg)==-1)
    {
        printf("Errore4");
        semctl(id_sem, -1, IPC_RMID,arg);
        shmctl(id_sem, IPC_RMID, NULL);
        shmdt(addr_mem);
        return -1;
    }
    arg.val=1;
    if(semctl(id_sem,1,SETVAL,arg)==-1)
    {
        printf("Errore5");
        semctl(id_sem, -1, IPC_RMID, arg);
        shmctl(id_sem, IPC_RMID, NULL);
        shmdt(addr_mem);
        return -1;
    }

    while(1)
    {
        param[0].sem_num=0;
        param[0].sem_op=-1;
        param[0].sem_flg=0;

        if(semop(id_sem,param,1)==-1)
        {
            printf("Errore6");
            return -1;
        }

        printf("Il messaggio scritto è: %s\n",(char *)addr_mem);
        param[0].sem_num=1;
        param[0].sem_op=1;
        param[0].sem_flg=0;
        if(semop(id_sem,param,1)==-1)
        {
            printf("Errore7");
            return -1;
        }
    }

}

我的程序应该只允许生产者进程在共享内存上写入,而消费者进程可以读取共享内存。

我首先收到这个“警告”,然后如果我尝试运行生产者,我会收到一个“分段错误”。我完全无法理解发生了什么。

我假设共享内存并没有真正创建,事实上如果我删除* ((char *) addr_mem) = '0';这行我没有得到“Segmentation Fault”,很明显“Scanf”没有写任何东西。

【问题讨论】:

  • 下次,明确指出错误发生的位置。下次首先调查错误位置发生了什么。
  • 我做到了,问题就是这样。我的眼睛看到一切都很完美,他们没有注意到缺少的括号。所以对我来说问题出在其他地方,但我不知道它在哪里,是什么。

标签: c unix warnings shared-memory


【解决方案1】:

IMO if(id_mem = shmget(key_mem,SHMEMSIZE,IPC_CREAT|0666) == -1) 的风格非常糟糕,正是针对您遇到的问题。您忘记在作业周围添加括号。您将shmget 的结果与-1 进行比较,然后将此结果分配给id_mem

改成if((id_mem = shmget(key_mem,SHMEMSIZE,IPC_CREAT|0666)) == -1)或者更好

id_mem = shmget(key_mem,SHMEMSIZE,IPC_CREAT|0666);
if (id_mem == -1)

下一个ifs也有同样的问题。

【讨论】:

  • 请注意,可能还有一个警告告诉您分配需要括号。警告很有用!
  • 你认为这个问题应该被删除吗?我同意
  • 留着就好,不会疼的。我认为这是一个常见的错误,现在我们有理由根本不使用这个结构。
  • 这不可能是全部。 id_mem 是一个整数。 == 的结果是一个整数。那么没有强制转换错误的整数指针在哪里?
  • 啊,没关系,这是同一种错误,但在不同的行:addr_mem =shmat(id_mem,NULL,0) == (void *)-1。那是给出编译器错误的行。
猜你喜欢
  • 2022-01-03
  • 2016-05-29
  • 2016-04-22
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 2019-02-16
相关资源
最近更新 更多