从不兼容的指针类型传递‘fgets’的参数 3 [默认启用]

Passing argument 3 of ‘fgets’ from incompatible pointer type [enabled by default]

我是 C 语言编程的完全新手,一直在尝试编写一个系统,该系统将采用整数输入、执行计算并将它们附加到一个字符串上,然后将其传递到共享内存。抱歉,如果我是个白痴,但我收到有关不兼容指针类型的错误。我不知道如何修复此错误。 编辑:对于糟糕的初始问题,我深表歉意。包含完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    /* The size (in bytes) of shared-memory object */
    const int SIZE = 4096;

    /* The name of shared-memory object */
    const char *Obj = "Shm";

    /* The shared-memory file descriptor */
    int shm_fd;

    /* The pointer to shared-memory object */
    void *ptr;

    /* Create the shared-memory object */
    shm_fd = shm_open(Obj, O_CREAT | O_RDWR, 0666);

    /* Configure the size of the shared-memory object */
    ftruncate(shm_fd, SIZE);

    /* Map the shared-memory object in the address space of the process */
    ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);

    if (ptr == MAP_FAILED) 
    {
       printf("Map failed\n");
       return -1;
    }

    int cal;
    char newStr[200];
    char currentStr[200];
    char *temp;
    char value;

    printf("Enter an integer");
    scanf("%d", &cal);


    /* Create a message and write it to the shared-memory object */
    /*fgets(ptr, SIZE, stdin);*/
    if (cal == 0) {
        printf("0 is not valid");
        return -1;
    }

    if (cal < 1) {
        printf("Please enter a positive int");
        return -1;
    }
    sprintf(newStr, "%d", cal);

    while (cal != 1) {
        if (cal % 2 == 0) {
            cal = cal / 2;
        }
        else {
            cal = 3 * cal + 1;
        }
        value = cal + '0';
        sprintf(currentStr, " --- %d", value);
        strcat(newStr, currentStr);
    }
    fgets(ptr, SIZE, newStr);
    printf("Writing the message to the shared memory is done! \n");

    return 0;
}

由于我的编码环境的性质,测试和找出错误的确切性质特别困难。

编辑:这是确切的错误消息

Collatz-Producer.c:84:2: warning: passing argument 3 of ‘fgets’ from incompatible pointer type [enabled by default]

我用 ptr 删除了上面的部分,因为我相信它有效,尽管这里是 ptr 等于

的具体内容
void *ptr;
ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);

根据this documentation,函数fgets接受3个参数,顺序为:

  1. 指向要写入的内存缓冲区的指针
  2. 内存缓冲区的大小
  3. 要从中读取的 FILE * 流,例如 stdin

数组 newStr 不是 FILE * 流。因此,它作为第三个参数是无效的。

如果您不打算从 FILE * 流(例如 stdin 或使用 fopen 打开的文件)读取,那么您不应该使用函数 fgets.