分段故障指针指向参考



我正在尝试一些Scott Meyers有效C 的代码,特别是项目3。

他的书中的代码应该与此非常相似(他遗漏了构造函数)

#include <iostream>

class TextBlock {
public:
    TextBlock(char* ptr) : ptrText(ptr)
    {}
     char& operator[](std::size_t pos) const {
        return ptrText[pos];
    }
private :
    char* ptrText;
};
int main(int argc, char* argv[]) {
    const TextBlock block("Hello");
    std::cout << block[0] << std::endl;
    char* ptr = &block[0];
    *ptr = 'J';
    std::cout << block[0];
}

在我更改指针ptr(*ptr ='j';)中的内容时,我会得到一个分割的故障(通常会在取消非初始化或释放指针时发生)。这不是在这里发生的, *ptr = 'J';

出了什么问题

TextBlock不拥有任何存储。它指向内存中的一个恒定字符串"Hello",您尝试修改只读内容。

如果您声明具有自己存储的本地变量,则可以使用:

char test[32] ;
strcpy( test, "Hello") ;
const TextBlock block( test) ;
char * ptr= &block[0] ;
*ptr= 'J' ;

您应该管理

ptrtext

成员不是指向禁止写入的恒定内存区域的指针,而是对您可以完全控制的基于堆栈或堆的对象的引用。

您可以使用char数组

#include <iostream>
#define MAX_LENGTH = 1024
class TextBlock {
public:
TextBlock(char* ptr)
{
    memset(ptrText, 0, MAX_LENGTH);
    memcpy(ptrText, ptr, strlen(ptr) < MAX_LENGTH?strlen(ptr):MAX_LENGTH);
}
char& operator[](std::size_t pos) const {
    return ptrText[pos];
}
private :
char ptrText[MAX_LENGTH];

};

#include <iostream>

class TextBlock {
public:
    TextBlock(char* ptr) : ptrText(ptr)
    {}
     char& operator[](std::size_t pos) const {
        return ptrText[pos];
    }
private :
    char* ptrText;
};
int main(int argc, char* argv[]) {
    char text[] = "Hello";
    const TextBlock block(text);
    std::cout << block[0] << std::endl;
    char* ptr = &block[0];
    *ptr = 'J';
    std::cout << block[0];
}

是的,这是真的!ptrtext只是记录" Hello"的PTR,而" Hello"是您无法更改的const静态文本。

最新更新