繁体   English   中英

尽管对每一位进行计数,但由 memcpy 引起的分段错误

[英]Segmentation fault caused by memcpy despite counting every bit

我正在尝试使用 memcpy 将数据从字符数组复制到我的班级成员中。 我在 memcpy 之前在调试器写入中设置了一个断点。 我检查了我将使用的所有变量,并计算了目标中剩余的空间,看起来它应该可以工作。

#include <iostream>
#include <cstdlib>

#include <cstring>

class bigNum
{
    unsigned int dataLength;
    unsigned long long int *data;

    public:
        bigNum(){
            //long long int is 8 bytes so (2 * 1024)long long int = 16 KiB
            //  if that's not enough, we can always add more later
            dataLength = 2048;
            data = new unsigned long long [dataLength];
        };

        virtual ~bigNum(){delete[] data;};

        //bigNum& operator=(const bigNum& other);

        bigNum& set(char chars[], unsigned int charsLength) {
            //calculate where we will start writing the data
            void *writeStart = (void*)(
                (unsigned long long)data + dataLength*64 - charsLength*8
            );

            //DEBUG -- set a couple of the array elements to watch in debugger
            data[2047] = data[2046] = ~((unsigned long long)0);

            //zero out the space before writeStart
            std::memset(data, 0, dataLength*8 - charsLength);

            //write the data starting at writeStart
            std::memcpy(writeStart, chars, charsLength);

            return *this;
        }
};


using namespace std;

int main()
{
    bigNum myNum;
    char chars[9] = {'a'};

    myNum.set(chars, 9);

    system("PAUSE");
    return 0;
}

错误在此声明中:

        void *writeStart = (void*)(
            (unsigned long long)data + dataLength*64 - charsLength*8
        );

也就是说,您似乎正在尝试以为单位获得正确的写入位置,而您应该以字节为单位进行此操作。

当您有dataLength*64charsLength*8类的语句时,您将乘以它们的大小(以位为单位) ,而您正在处理的内容 - 指针 - 指的是bytes

但是,似乎您在玩整数大小。 不要那样做! 这意味着您的代码将在其他机器架构上中断。 不要假设unsigned long long是 64 位,而是找出他们使用sizeof(unsigned long long)确切字节数,或者如果您想要一个固定宽度的整数,请使用相应的类型,如uint64_t

再说一次,对于 C++,您应该坚持使用标准容器,如std::vector

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM