使用结构和指针的分段错误(核心转储)

Posted

技术标签:

【中文标题】使用结构和指针的分段错误(核心转储)【英文标题】:segmentation fault (core dumped) using structures and pointers 【发布时间】:2020-07-22 14:34:27 【问题描述】:

这是我第一次在这里提问,所以这里是上下文:

我所从事的项目是机密且相当复杂的,但是,它是 C C++ 和 PostgreSQL 的混合体,我只能这么说。尽管如此,这是一个最小的 WORKING 示例(实际上可以正常编译),但在生成目标代码后会引发错误:

`

#include <iostream>

using namespace std;
typedef size_t Size;
#define INDEX_SIZE_MASK   0x1FFF
typedef struct IndexTupleData

    //ItemPointerData t_tid;        /* reference TID to heap tuple */

    /* ---------------
     * t_info is laid out in the following fashion:
     *
     * 15th (high) bit: has nulls
     * 14th bit: has var-width attributes
     * 13th bit: AM-defined meaning
     * 12-0 bit: size of tuple
     * ---------------
     */

    unsigned int t_info;        /* various info about tuple */

 IndexTupleData;               /* MORE DATA FOLLOWS AT END OF STRUCT */
typedef IndexTupleData *IndexTuple;
#define IndexTupleDSize(itup)       ((Size) ((itup).t_info & INDEX_SIZE_MASK))
int main ()


IndexTuple itup;
(*itup).t_info = 1;
cout << ((*itup).t_info) << endl;


//cout << *itup.t_info << endl;
//int itemsz = IndexTupleDSize(*itup);


//cout << itup.t_info << endl;

//cout << *itup.t_info << endl;


return 0;

`

虽然编译/链接非常简单:

g++ -c IndexTupleDSize.cpp

g++ -o I IndexTupleDSize.o

./我

然后,它抛出:

Segmentation fault (core dumped)

我知道根据Pointers in C with Segmentation fault (core dumped) error 和在谷歌找到的许多相关主题;问题是我想访问一个不允许访问的内存区域。另一个提示是使用箭头运算符( itup->t_info 而不是 *itup.t_info ),两个块代码编译但最终结果相同......

您能否解释一下为什么以及如何引发此错误?

【问题讨论】:

(*itup).t_info = 1;,不。您只有一个不指向任何有效内存的指针。 itup 是一个指针,这意味着它是一个存储另一个变量地址的变量。您希望存储其地址的另一个变量在哪里? 【参考方案1】:

在取消引用指针之前,您必须分配要访问的对象并分配它们的指针。

int main ()


    IndexTuple itup;
    itup = new IndexTupleData; // allocate object and assign its pointer
    
    (*itup).t_info = 1;
    cout << ((*itup).t_info) << endl;



    delete itup; // delete allocated object

    return 0;

【讨论】:

它工作正常,谢谢。问题是我没有对实际项目中以前的代码块进行太多分析,所以当我不得不重现它时,我完全忘记了考虑它(当然是声明指针并释放它)。再次感谢大家!主题可以关闭。 :)

以上是关于使用结构和指针的分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

识别导致分段错误(核心转储)的错误

获取“分段错误核心转储”

C++中char指针中的memset的分段错误(核心转储)[重复]

如何防止我的程序出现此分段错误(核心转储)?

c++:分段错误(核心转储)

为啥我的代码中出现分段错误(核心转储)错误?