【问题标题】:How to get rid of the pointer from integer without a cast error?如何在没有转换错误的情况下从整数中删除指针?
【发布时间】:2021-04-09 12:39:38
【问题描述】:

我已经让inotifyFunc 监控两条路径。除了最后一行 [我从主函数中获取的代码]monitor.wd[0],没有什么给我错误。错误是

警告:传递“inotifyFunc”的参数 3 使指针从 没有强制转换的整数

不知道是什么问题?虽然上面这行monitor.wd[0] = *pathname1; 没有给我报错。

void inotifyFunc(char *path, uint32_t *maskPtr, int *wd[2]){
    monitor.fd = inotify_init();
    if(fcntl(monitor.fd, F_SETFL, O_NONBLOCK)){
       perror("inotify not initialized: ");
       exit(0);
    }

    *wd[0] = inotify_add_watch(monitor.fd, path, *maskPtr);
    *wd[1] = inotify_add_watch(monitor.fd, path, *maskPtr);

    if(*wd[0] < 0 || *wd[1] < 0){
        perror("Sorry");
        exit(1);
    }
}

取自主函数的代码

monitor.mask[0] = ENOENT;
monitor.mask[1] = IN_CREATE;

printf("Choose the source path: ");
scanf("%s", pathname1);
monitor.wd[0] = *pathname1;
inotifyFunc(pathname1, &monitor.mask[0], monitor.wd[0]);

【问题讨论】:

  • 这可能只是我的无知(我从未使用过inotify),但如果monitorstruct inotify_event 类型,我怀疑wdint 类型绝对不是字符串数组。此外,同一结构的mask 字段的类型为uint32_t,所以我不明白你为什么将它用作数组。能否请您发布monitor 类型的结构定义?
  • 我认为你选择了一个坏名字wd。这个名字是什么意思?您可以使用哪个更具描述性的名称?也许,如果你回答这个问题,你可以解决你的问题。或者,如果不是,您至少可以澄清您最初的问题。
  • 从不在 scanf 中使用 "%s"。不比gets好。如果您要为此使用 scanf,至少在转换说明符中使用宽度。例如char path[256]; scanf("%255s", path);

标签: c inotify


【解决方案1】:

从这里的这个scanf

scanf("%s", pathname1);

似乎pathname1 是指向char 的指针。如果是这样的话,那就这样做吧

monitor.wd[0] = *pathname1;

monitor.wd[0] 必须是 char。所以当你将它传递给一个函数时,你应该收到一个简单的char,而不是一个指向int的指针数组:int *wd[2]

void inotifyFunc(char *path, uint32_t *maskPtr, char wd)

如果您提供更多上下文,也许我们可以得到您想要做的事情。

【讨论】:

  • 好的,但如果我声明char wd,那么我的数组将毫无用处。我写了 char wd[2] 但这行 inotifyFunc(pathname1, &amp;monitor.mask[0], monitor.wd[0]); 仍然给我同样的错误。
  • 目前看来monitor.wd[0] 只是一个字符。您不能传递一个字符并期望收到一个包含 2 个字符的数组
【解决方案2】:
monitor.wd[0] = *pathname1;

这行没有意义。我不知道你想做什么,但无论如何,这条线肯定是错误的。 inotifyFunc 仅使用monitor.wd 进行输出,因此在调用inotifyFunc 之前将monitor.wd 设置为某个值是没有意义的。此外,monitor.wd[0] 是一个指向整数的指针(尽管您可能想要一个整数),给它分配一个字符是没有意义的。你为什么要取文件路径的第一个字符呢?所以删除这一行。

鉴于您遇到的错误,monitor.wd 似乎是一个整数数组:

struct {
    …
    int wd[2];
} monitor;

(但我不应该猜测!当您提出问题时,请务必发布完整的代码。)如果是这样,您在 inotifyFunc 中声明和使用它是错误的:wdinotifyFunc 中是指向整数的指针数组,而不是整数数组。假设 monitor.wd 实际上是上面声明的整数数组,请更改 inotifyFunc 以通过删除虚假指针取消引用来正确使用它:

void inotifyFunc(char *path, uint32_t *maskPtr, int wd[2]){
    monitor.fd = inotify_init();
    if(fcntl(monitor.fd, F_SETFL, O_NONBLOCK)){
       perror("inotify not initialized: ");
       exit(0);
    }

    wd[0] = inotify_add_watch(monitor.fd, path, *maskPtr);
    wd[1] = inotify_add_watch(monitor.fd, path, *maskPtr);

    if(wd[0] < 0 || wd[1] < 0){
        perror("Sorry");
        exit(1);
    }
}

如果你真的想在inotifyFunc 中有一个指向整数的指针数组,那么修复monitor.wd 的声明并确保在调用它之前指针指向分配的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多