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 系统上声明。
- 您应该将
r
和 l
定义为 char *
,将 len
、tl
和 l
定义为 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;
}
我有 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 系统上声明。 - 您应该将
r
和l
定义为char *
,将len
、tl
和l
定义为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;
}