分段错误指向引用的指针

时间:2014-01-24 03:25:57

标签: c++ pointers

我正在尝试一些Scott Meyers Effective 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';

出了什么问题

4 个答案:

答案 0 :(得分:4)

TextBlock没有任何存储空间。它指向内存"Hello"中的常量字符串,并且您已尝试修改只读内容。

如果您声明了一个具有自己存储的局部变量,那么这将起作用,例如:

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

*ptr= 'J' ;

答案 1 :(得分:1)

你应该管理

  

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];

};

答案 2 :(得分:0)

#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];
}

答案 3 :(得分:0)

是的,这是真的! ptrText只记录“hello”的ptr,而“hello”是const静态文本,你无法改变它。它没有存储任何东西〜所以你不能改变它。