【问题标题】:Variable disappears after memmem functionmemmem函数后变量消失
【发布时间】:2021-01-12 10:02:56
【问题描述】:

我有 2 个项目:我编写了第一个 C 程序,它对单词进行子串化,它运行良好。然后我需要为第二个项目使用相同的代码:我将下面的代码块从第一个项目复制并粘贴到第二个项目。不幸的是,它不适用于第二个项目。 r 变量消失了。我用相同的内容同时调试了两个项目。但是在memmem 操作之后,r 的值就消失了。 ptru_int8_t 和参数。

const u_int8_t *r,
r = ptr
r = ( const u_int8_t *)memmem(r + 1, len - (r - ptr) - 2, tag, tl);

谢谢。

“值消失”表示IDE在调试模式下memmem操作后不显示变量。

这里是源代码:

char *gettag(const void *ptr, unsigned long len, const char *tag, unsigned long *gettaglen) {
    unsigned long register r, l, tl;
    char *rc;

    tl = strlen(tag);
    r = (unsigned long)memmem(ptr, len, tag, tl);
    if (r == 0) {
        l = 0;
    } else {
        r += tl;
        l = (unsigned long)memmem((void *)r, len - (r - (unsigned long)ptr), "\r\n", 2);
        if (l > 0) {
            l -= r;
        } else {
            l = 0;
            r = 0;
        }
    }
    rc = (char*)r;
    if (rc) {
        while (rc[0] == ' ') {
            rc++;
            l--;
        }
    }
    *gettaglen = l;
    return rc;
}

【问题讨论】:

  • 这个问题很不清楚。 “价值消失”是什么意思?请提供minimal verifiable example的代码、输入、预期结果和实际结果。
  • “值消失”表示IDE在debug模式下memmem操作后不显示变量。 @kaylum
  • 什么IDE?你不认为至少告诉我们这么多有意义吗?而且不显示在哪里?我们看不到您正在查看的内容,因此您需要更清楚地描述问题。通常不鼓励对 SO 问题使用屏幕截图,但在这种情况下可能会有所帮助。
  • 我在 Ubuntu 16.04 上使用 QT Creator。 @kaylum
  • @Ms.Sahin 您是否正在调试优化的构建?根据您稍后使用r 的方式,编译器甚至可以不为其分配内存/堆栈位置,而是在需要时将其存储在寄存器中。

标签: c pointers substring


【解决方案1】:

那是因为编译器优化 你需要在变量名前写“volatile” 记住编译器会自动删除未使用的变量

volatile const uint8_t *r,
r = ptr
r = (const uint8_t*) memmem(r+1, len-(r-ptr)-2, tag, tl);

【讨论】:

  • 恐怕你的回答没有解决 OP 的问题:volatile 远远超出了她的技能水平。这个问题是一个更基本的问题,但缺少完整的源代码。
【解决方案2】:

我解决了这个问题。

我在下面添加了代码块,它工作了。

#ifndef _GNU_SOURCE
void *memmem(const void* haystack, size_t hl, const void* needle, size_t nl);
#endif

讨厌的人会讨厌。

【讨论】:

    【解决方案3】:

    您的代码中存在多个问题:

    • 如果定义了标识符_GNU_SOURCE,则应包含<string.h>,其中memmem 是在GNU 系统上声明的。
    • 您应该将rl 定义为char *lentll 作为size_t
    • register 现在没用了。

    这是修改后的版本:

    #define _GNU_SOURCE 1
    #include <string.h>
    
    char *gettag(const void *ptr, size_t len, const char *tag, unsigned long *gettaglen) {
        size_t tl = strlen(tag);
        size_t taglen = 0;
        char *r, *l, *rc = NULL;
    
        r = memmem(ptr, len, tag, tl);
        if (r != NULL) {
            r += tl;
            l = memmem(r, len - (r - ptr), "\r\n", 2);
            if (l != NULL) {
                rc = r;
                while (*rc == ' ') {
                    rc++;
                }
                taglen = l - rc;
            }
        }
        *gettaglen = taglen;
        return rc;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2021-06-21
      相关资源
      最近更新 更多