数组值在循环中重置

时间:2016-07-29 18:35:02

标签: c

所以我使用poll()来读取几个gpio引脚。然后,我将先前读取的值与新读取的值进行比较,看看它们是否已更改。读取值的工作正常。我的问题似乎在循环中。这可以从输出看出,它看起来像buffers在循环开始时被重置。为什么会这样?

注意:如果有人想知道为什么我不仅仅使用poll()作为延迟为-1的中断,那是因为硬件问题使它不受支持。

代码

static const int num_buttons = 2;

void *routine(){

    struct pollfd pfd[num_buttons];
    int fds[num_buttons];
    const char gpioValLocations[num_buttons][256];
    int i;
    for (i = 0; i < num_buttons ; i++){
        sprintf(gpioValLocations[i], "/sys/class/gpio/gpio%d/value", gpios[i]);
    }
    char buffers[num_buttons][2];
    char prev_buffers[num_buttons][2];

    for (i = 0; i < num_buttons; i++){
        if ((fds[i]= open(gpioValLocations[i],O_RDONLY)) < 0) {
            LOGD("failed on 1st open");
            exit(1);
        }
        pfd[i].fd = fds[i];  
        pfd[i].events = POLLIN;
        lseek(fds[i], 0, SEEK_SET); 
        read(fds[i], buffers[i], sizeof buffers[i]);
    }

    for (;;) {

        LOGD("at top: prev:%d%d buff:%d%d", atoi(prev_buffers[0]), atoi(prev_buffers[1]), atoi(buffers[0]), atoi(buffers[1]));

        poll(pfd, num_buttons, 1);

        for (i = 0; i < num_buttons; i++) {
            if ((pfd[i].revents & POLLIN)) {

                /* copy current values to compare to next to detected change */
                strcpy(prev_buffers[i], buffers[i]);
                LOGD("in loop: prev:%d%d buff:%d%d",
                 atoi(prev_buffers[0]), atoi(prev_buffers[1]),
                 atoi(buffers[0]), atoi(buffers[1]));

                /* read new values */
               lseek(fds[i], 0, SEEK_SET);
               read(fds[i], buffers[i], sizeof buffers[i]);

                /* compare new to previous */
                if (atoi(prev_buffers[i]) != atoi(buffers[i])) {
//                  LOGD("change detected");
                }
            }
        }
    }
}

输出

at top: prev:00 buff:01
in loop: prev:01 buff:00
in loop: prev:00 buff:00
at top: prev:00 buff:01
in loop: prev:01 buff:00
in loop: prev:00 buff:00

1 个答案:

答案 0 :(得分:0)

这条线似乎有风险:

strcpy(prev_buffers[i], buffers[i]);

prev_buffers[i]只有2个字节长。如果buffers[i]包含多个字符,则会出现缓冲区溢出并调用未定义的行为。

此外,您必须初始化buffers,它们当前以随机垃圾开始,而不是单字节字符串:使用strcpy保存之前的值会调用未定义的行为。使用memcpy()来保存以前的内容风险较小,因为它只复制2个字节,而不是扫描缓冲区以寻找空终止符,可能在读取buffers[i]结束时以及何时读取未定义的行为写在prev_buffers[i]的结尾。

您确定read(fds[i], buffers[i], sizeof buffers[i]);读取ASCII数字和空终止符吗?如果没有,则代码不正确。

发布一个完整的编译功能,可能会有更多问题。