Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回作为结构的char*时出现问题 < P> >我是C++的新手,我试图通过CHAR*. #include<iostream> using namespace std; #include <cstring> class test { public: struct pair { int a,b; }; test(){ pir=new pair; pir->a=1; pir->b=2; } void readx(char* str) { char* str2=new char[sizeof(pair)+1]; str2=reinterpret_cast<char*>(pir); strncpy(str,str2,sizeof(pair)); } private: pair* pir; }; int main() { test t; char* ptr; t.readx(ptr); cout<<*((int*)ptr)<<endl; cout<<*((int*)ptr+4)<<endl; return 0; }_C++_Struct_Char - Fatal编程技术网

返回作为结构的char*时出现问题 < P> >我是C++的新手,我试图通过CHAR*. #include<iostream> using namespace std; #include <cstring> class test { public: struct pair { int a,b; }; test(){ pir=new pair; pir->a=1; pir->b=2; } void readx(char* str) { char* str2=new char[sizeof(pair)+1]; str2=reinterpret_cast<char*>(pir); strncpy(str,str2,sizeof(pair)); } private: pair* pir; }; int main() { test t; char* ptr; t.readx(ptr); cout<<*((int*)ptr)<<endl; cout<<*((int*)ptr+4)<<endl; return 0; }

返回作为结构的char*时出现问题 < P> >我是C++的新手,我试图通过CHAR*. #include<iostream> using namespace std; #include <cstring> class test { public: struct pair { int a,b; }; test(){ pir=new pair; pir->a=1; pir->b=2; } void readx(char* str) { char* str2=new char[sizeof(pair)+1]; str2=reinterpret_cast<char*>(pir); strncpy(str,str2,sizeof(pair)); } private: pair* pir; }; int main() { test t; char* ptr; t.readx(ptr); cout<<*((int*)ptr)<<endl; cout<<*((int*)ptr+4)<<endl; return 0; },c++,struct,char,C++,Struct,Char,如何返回类中关于struct的所有内容?coutcout您正在将int指针递增4。这表示前面有4个整数。那不是你想要的 cout<<*((int*)ptr+4)<<endl; cout<<*((int*)ptr+1)<<endl; #include <iostream> #include <cstring> using namespace std; class test { public: struct pa

如何返回类中关于struct的所有内容?

cout
cout您正在将int指针递增4。这表示前面有4个整数。那不是你想要的

cout<<*((int*)ptr+4)<<endl;
cout<<*((int*)ptr+1)<<endl;
#include <iostream>
#include <cstring>

using namespace std;

class test
{
public:
    struct pair
    {
        int a, b;
    };

    test() : pir{ new pair() }
    {
        pir->a = 1;
        pir->b = 2;
    }

    ~test() { delete pir; }

    void readx(char* str)
    {
        memcpy(str, reinterpret_cast<char*>(pir), sizeof(pair));
    }
private:
    pair* pir;
};

int main()
{
    test t;
    char* ptr = new char[sizeof(test::pair)];
    t.readx(ptr);

    cout << *((int*)ptr) << endl;
    cout << *((int*)ptr + 1) << endl;

    delete[] ptr;

    return 0;
}

cout您正在将int指针递增4。这表示前面有4个整数。那不是你想要的

cout<<*((int*)ptr+1)<<endl;
#include <iostream>
#include <cstring>

using namespace std;

class test
{
public:
    struct pair
    {
        int a, b;
    };

    test() : pir{ new pair() }
    {
        pir->a = 1;
        pir->b = 2;
    }

    ~test() { delete pir; }

    void readx(char* str)
    {
        memcpy(str, reinterpret_cast<char*>(pir), sizeof(pair));
    }
private:
    pair* pir;
};

int main()
{
    test t;
    char* ptr = new char[sizeof(test::pair)];
    t.readx(ptr);

    cout << *((int*)ptr) << endl;
    cout << *((int*)ptr + 1) << endl;

    delete[] ptr;

    return 0;
}

cout您的代码有严重问题。如果它真的起作用,那只是偶然的

  • 无论是
    strncpy
    还是
    memset
    您都可以使用它,这并不重要,因为您正在向写入它的函数传递单元化指针:

    char* ptr;
    t.readx(ptr);
    
    ptr
    指向哪里?它几乎可以指向任何地方,将其用作
    memcpy
    目标是不可预测的。如果你不是很不走运,你会得到一个segfault/access违规

  • 您的
    readx
    方法做了一些疯狂的事情:

    char* str2 = new char[sizeof(pair)+1];
    str2 = reinterpret_cast<char*>(pir);
    
    当您理解了基本问题时,您的代码已经阅读了关于五的规则。对于
    test
    类,您可以添加如下内容:

    #include <algorithm>
    
    class test
    {
        //...
    
        test(test const& other) : pir{ new pair() }
        {
            pir->a = other.pir->a;
            pir->b = other.pir->b;
        }
    
        test& operator=(test const& other)
        {
            test copy(other);
            swap(*this, copy);
            return *this;
        }
    
        test(test&& other) noexcept : pir{ nullptr }
        {
            swap(*this, other);
        }
    
        test& operator=(test&& other) noexcept
        {
            swap(*this, other);
            return *this;
        }
    
        friend void swap(test& lhs, test& rhs)
        {
            std::swap(lhs.pir, rhs.pir);
        }
    };
    
    #包括
    课堂测试
    {
    //...
    test(test const&other):pir{new pair()}
    {
    pir->a=其他。pir->a;
    pir->b=其他。pir->b;
    }
    测试和运算符=(测试常量和其他)
    {
    测试副本(其他);
    掉期(*本,副本);
    归还*这个;
    }
    测试(测试和其他)无例外:pir{nullptr}
    {
    掉期(*本,其他);
    }
    测试和运算符=(测试和其他)无例外
    {
    掉期(*本,其他);
    归还*这个;
    }
    朋友无效交换(测试和左侧、测试和右侧)
    {
    标准:互换(左S.pir、右S.pir);
    }
    };
    
    您的代码存在严重问题。如果它真的起作用,那只是偶然的

  • 无论是
    strncpy
    还是
    memset
    您都可以使用它,这并不重要,因为您正在向写入它的函数传递单元化指针:

    char* ptr;
    t.readx(ptr);
    
    ptr
    指向哪里?它几乎可以指向任何地方,将其用作
    memcpy
    目标是不可预测的。如果你不是很不走运,你会得到一个segfault/access违规

  • 您的
    readx
    方法做了一些疯狂的事情:

    char* str2 = new char[sizeof(pair)+1];
    str2 = reinterpret_cast<char*>(pir);
    
    当您理解了基本问题时,您的代码已经阅读了关于五的规则。对于
    test
    类,您可以添加如下内容:

    #include <algorithm>
    
    class test
    {
        //...
    
        test(test const& other) : pir{ new pair() }
        {
            pir->a = other.pir->a;
            pir->b = other.pir->b;
        }
    
        test& operator=(test const& other)
        {
            test copy(other);
            swap(*this, copy);
            return *this;
        }
    
        test(test&& other) noexcept : pir{ nullptr }
        {
            swap(*this, other);
        }
    
        test& operator=(test&& other) noexcept
        {
            swap(*this, other);
            return *this;
        }
    
        friend void swap(test& lhs, test& rhs)
        {
            std::swap(lhs.pir, rhs.pir);
        }
    };
    
    #包括
    课堂测试
    {
    //...
    test(test const&other):pir{new pair()}
    {
    pir->a=其他。pir->a;
    pir->b=其他。pir->b;
    }
    测试和运算符=(测试常量和其他)
    {
    测试副本(其他);
    掉期(*本,副本);
    归还*这个;
    }
    测试(测试和其他)无例外:pir{nullptr}
    {
    掉期(*本,其他);
    }
    测试和运算符=(测试和其他)无例外
    {
    掉期(*本,其他);
    归还*这个;
    }
    朋友无效交换(测试和左侧、测试和右侧)
    {
    标准:互换(左S.pir、右S.pir);
    }
    };
    
    strncpy()
    用于复制以NUL结尾的字符串。试着改用
    memcpy()
    。@MikeCAT我刚试过
    memcpy()
    ,但它似乎也不起作用。再加上memcpy和+1的变化,它真的起作用了!非常感谢
    strncpy()
    用于复制以NUL结尾的字符串。试着改用
    memcpy()
    。@MikeCAT我刚试过
    memcpy()
    ,但它似乎也不起作用。再加上memcpy和+1的变化,它真的起作用了!谢谢!!结合使用
    memcpy
    +1
    进行的更改,它真的很有效!谢谢!!结合使用
    memcpy
    +1
    进行的更改,它真的很有效!谢谢!!别忘了3的规则(或是C++11之后的5)。@O'Neil添加了一些与5的规则相关的代码。我从来没有期待过更好的答案!非常感谢您的详细介绍,尽管我对最后一部分中的代码仍然感到困惑。我马上查一查五的规则。再次感谢您的帮助!别忘了3的规则(或是C++11之后的5)。@O'Neil添加了一些与5的规则相关的代码。我从来没有期待过更好的答案!非常感谢您的详细介绍,尽管我对最后一部分中的代码仍然感到困惑。我马上查一查五的规则。再次感谢您的帮助!