memmem 函数后变量消失

Variable disappears after memmem function

我有 2 个项目:我编写了第一个 C 程序,它对单词进行子字符串化,并且运行良好。然后我需要第二个项目的相同代码:我将下面的代码块从第一个项目复制并粘贴到第二个项目。不幸的是,它不适用于第二个项目。 r 变量消失了。我同时调试了两个项目,内容相同。但是memmem操作后,r值消失了。 ptr 是一个 u_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;
}

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

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

我解决了问题。

我添加了下面的代码块,它起作用了。

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

讨厌的人会讨厌。

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

  • 如果定义了标识符 _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;
}