在调试应用程序时,我在内存中找到了一个结构,我100%肯定只有4个字符串。虽然我不太确定如何将其转换为数据结构,所以我可以使用结构指针地址来访问值。例如,这里是数据结构在内存中的样子(例如,假设它一直位于内存地址0x123456)
数据结构由4个单独的字符串组成
string 1 = ad
string 2 = dgdhkkkkkkhkk
string 3 = ggghhjk
string 4 = dgcfoh
我尝试过创建像
这样的数据结构struct reversedConnectionDat_t
{
char * data1;
char * data2;
char * data3;
char * data4;
}
这就是我尝试访问数据的方式
reversedConnectionDat_t * storeDat = (reversedConnectionDat_t*)0x123456;
print(storeDat->data3);
但它似乎不起作用。我没有正确地从内存中读取字符串吗?
(哦,字符串有时会改变我在上面发布的示例代码中发布的内容,即有时字符串1的长度为7,字符串3的长度仅为2 ...等等。
答案 0 :(得分:2)
你有一个指向指针结构的指针,所以即使你将结构指向正确的内存地址,你仍然在结构中有未初始化的指针。你需要为他们提供实际的记忆。我会尝试设置这样的结构......
struct reversedConnectionDat_t
{
char data1 [3];
char data2 [50];
char data3 [50];
char data4 [50];
}
顺便说一句,我没有数空间。我只是猜到了,但你明白了。
答案 1 :(得分:1)
我认为您错误地识别了该数据结构。我怀疑你拥有的是三个独立的缓冲区,每个缓冲区都可以容纳一个或多个以空字符结尾的字符串。
第一个结构长度为68个字节,包含"ad\0dgdhkkkkkkhkk\0"
(后跟足够的\0
来填充缓冲区。
这个缓冲区实际上可能只有64个字节长,而后面的四个字节可能用于其他一些数据元素。
第二个缓冲区长度为64字节,包含一个字符串,并填充\0
个字符以填充64个字节。
不可能说第三个缓冲区有多长。我们所知道的是它足以保持字符串"dgcfoh\0"
。我猜测缓冲区是64字节长,但如果我获得更多数据,愿意修改这个意见。
我认为你想要的结构是:
struct s
{
char data1[68]; // buffer holds one or more null-terminated strings
char data2[64];
char data3[64].
}
根据您提供给我们的信息很少,这就是我的开始。然后,您需要一种方法来解析以null结尾的字符串的缓冲区。也就是说,从第一个缓冲区获取两个单独的字符串。这是一个非常简单的C代码。
答案 2 :(得分:0)
您正在使用指针(char*
),结构的结构大小是4个指针的大小。如果要获取字符串,则应使用固定大小的数组(char[]
)。
仅当您的字符串大小等于缓冲区大小时才会起作用。
IMO最好的方法是获取一个char数组,然后找到空终止符
/0
,然后将指针配置为指向每个字符串的开头(在前3个空终止符的开头和右侧)。
char* pointerToMem = something; //your strings data
yourStruct.str1 = pointerToMem;
while(*pointerToMem != '\0')
{
pointerToMem++;
}
yourStruct.str2 = pointerToMem + 1;
这是你如何使指针结构工作的方法。这段代码不是最佳的,您不应该使用它,但它显示了如何从内存中获取字符串。要拥有一个C字符串,您只需要第一个字符的地址和末尾的一些空终结符。
答案 3 :(得分:0)
除了你的magicnumber:0x123456
之外,我无法理解你的代码有什么问题,这可能不适合你的结构。您确定magic-number
导致数据与您定义的结构兼容吗?比如,如果你试图访问storeDat->data3
,它肯定会导致seg-fault,除非你做了如下的事情,或者你很幸运。
struct R{
char *a;
char *b;
};
int main(void)
{
struct R *r1 = (struct R*) malloc(sizeof(struct R));
r1->a = "12333"; //Pointing to a string literal
r1->b = "12331"; //Pointing to a string literal
int address = (int)&r1;
struct R *r2 = (struct R*) address;
std::cout<<r2->b;
return 0;
}
P.S。 - 我不是一个优秀的程序员。但我只是好奇地回答,因为我认为这可能会有所帮助。对不起,如果我无法正确理解您的问题。