学习 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 标头 <stdlib.h>
命名为 <cstdlib>
。并且此标头未在您的程序中使用。所以你可以删除它。
程序可能看起来像
#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++中char指针中的memset的分段错误(核心转储)[重复]