学习 C++ 指针使用以下代码运行到核心转储中,我真的不知道为啥?

Posted

技术标签:

【中文标题】学习 C++ 指针使用以下代码运行到核心转储中,我真的不知道为啥?【英文标题】:Learning C++ pointer runs into core dump with following code, I really don't why?学习 C++ 指针使用以下代码运行到核心转储中,我真的不知道为什么? 【发布时间】:2014-11-09 15:00:37 【问题描述】:
#include <stdlib.h>
int main()
    int *array = new int[2];
    array[0] = 1;
    array[1] = 2;
    int ** dp = NULL;
    *dp = array;
    return 0;
    

当我运行它时,分段错误(核心转储)。 g++ 版本是

从 /usr/lib/gcc/x86_64-redhat-linux/3.4.5/specs 读取规范 配置:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=x86_64-redhat-linux 线程模型:posix gcc 版本 3.4.5 20051201(红帽 3.4.5-2)

【问题讨论】:

取消引用空指针是未定义的行为。 我希望你只是为了理解它们而尝试指针。在您的代码示例中,实际上不需要使用任何指针。您应该使用局部变量而不是动态分配的变量。请阅读并尝试理解:***.com/questions/22146094/… 【参考方案1】:

更改以下语句

int ** dp = new int *;

*dp = array;

或者你甚至可以写一个语句而不是上面的两个

int ** dp = new int *( array );

也不要忘记释放分配的内存

delete dp;
delete []array;

至于您的代码,那么您正在尝试取消引用空指针。

考虑到 C++ 中的 C 标头 &lt;stdlib.h&gt; 命名为 &lt;cstdlib&gt;。并且此标头未在您的程序中使用。所以你可以删除它。

程序可能看起来像

#include <iostream>

int main() 

    int *array = new int[2]  1, 2 ;
    int ** dp = new int *( array );

    std::cout << ( *dp )[0] << '\t' << ( *dp )[1] << std::endl;

    delete dp;
    delete []array;

    return 0;

输出是

1   2

【讨论】:

【参考方案2】:

这一行

*dp = array;

没有按照您的意愿行事。 'dp' 是指向指针的指针,其初始值为零 (NULL)。因此,您试图告诉系统将“数组”的地址放置到内存位置 0,这是非法的。 为了让它首先工作,你需要分配一些 int *

dp = new int*[5];  // for example...
dp[0] = array;

这会将第一个指针分配给您的数组

【讨论】:

以上是关于学习 C++ 指针使用以下代码运行到核心转储中,我真的不知道为啥?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

g++ 编译后的核心转储 + 与 jni 的链接以及随后使用 C++ 和 Java 执行应用程序

分段错误(核心转储)C++,因为我使用了大量内存 [重复]

(C++)我正在尝试从文本文件中读取和输出随机行,并且在运行它时不断收到“浮点异常(核心转储)”