C++ 字符串追加上的奇怪行为

strange behavior on c++ string append

本文关键字:字符串 追加 C++      更新时间:2023-10-16

我的类中的 c++ 字符串对象有一个奇怪的问题,s.append(ptr2str ....);

class cRegexMatches {
public:
    char *ptr2str;
    int   *pOffsets;
    cRegexMatches() { ptr2str = NULL; pOffsets=NULL;}
    void update(char *p, int *offsets) {
        ptr2str = p; pOffsets = offsets;
        printf("ptr2str=%p %s|n", p, p);
    }
    string operator [] (int id) {
        string s;
        printf("operator[] %p %s|", ptr2str, ptr2str);
        int i;
        for (i=0; i<4; i++) printf(" %d", pOffsets[i]);
        printf("n");
        if (!ptr2str) return s;
        if (pOffsets[2 * id + 1] == 0) return s;
        int len = pOffsets[2 * id + 1] - pOffsets[2 * id];
        printf("size %d %ld before %sn", s.size(), len, ptr2str + pOffsets[2 * id]);
        s.append(ptr2str + pOffsets[2 * id], len);
        cout << s << endl;
        return s;
    }
};

使用以下代码,它可以正常运行。

int main(int argc, char *argv[]) {
    char *p = "10.20.0.111:8080";
    int pInts[] = {0, 16, 0,16};
    regmatches.update(p, &pInts[0]);
    string s =  regmatches[0];
    int i;
    for (i=0; i<s.size(); i++) {
        printf("%cn", s.c_str()[i]);
    } 
    return 0;
}

但是在我的项目中,根据 s.append 之前的调试printf(..)语句和之后的 cout ...,行s.append(ptr2str + pOffsets[2 * id], len);似乎损坏了第一个字节为 \x00。

知道是什么导致了这种奇怪的行为吗? 谢谢!

更新 1

感谢@user657267的建议,这里简要介绍了如何在我的项目中使用代码。 看起来很无辜。

cRegexMatches globalVar;
//p points to some c string 
//pInt points to an array of integers, in my case, it's 0,  16, 0, 16
globalVar.update(p, pInt);
cout << globalVar[0]

现在,我找到了一个解决方法:我将行s.append(ptr2str + pOffsets[2 * id], len);更改为return string(ptr2str + pOffsets[2 * id], len);,并且工作正常。 但我仍然很好奇是什么导致了这种奇怪的行为。

我相信

问题可能是您对 main 中字符串的定义。

char* p = "10.20.0.111:8080";

应该是

char p[] = "10.20.0.111:8080";

只有第二个定义在堆栈上保留内存。