繁体   English   中英

使用C ++指针获取分段错误

[英]Getting segmentation fault with c++ pointers

因此,我试图通过运行以下代码来熟悉c ++指针。

#include <iostream>

using namespace std;

int main(void){
    int* x;
    cout << &x << endl;
    return 0;
 }

可以正常工作并打印x的指针值,但是

#include <iostream>

using namespace std;

int main(void){
    int* x;
    *x = 100;
    cout << &x << endl;
    return 0;
 }

当我尝试调整细分时会给我带来细分错误。 为什么是这样? 我看不到多余的行应该如何改变x的地址。

您没有分配要分配的对象。

int* x;

x的值未指定,可以是任意值。 所以下一条语句

*x = 100;

是无效的。

你必须写

x = new int;

*x = 100;

要么

x = new int( 100 );

甚至

x = new int { 100 };

前提是您的编译器支持C ++ 2011中引入的new运算符的列表初始化。

您有未定义的行为

您的第一个示例很好,因为&x (类型为int** )是堆栈分配的指针的地址。 cout中的<<重载之一被定义为正确输出。

在第二个示例中,您要取消引用没有指向任何内容的指针。 那是不确定的行为 因此崩溃。 如果你写过

int y;
int* x;
x = &y;
*x = 100; /*this means that y is now 100*/

那么自从x指向某个东西以来,一切都会很好。

并输出x的指针值

不完全是。

  • std::cout << &x; 它输出x的地址(指针的地址);
  • std::cout << x; 打印地址, x指向;
  • std::cout << *x; 打印x指向的内容;

int* x;
*x = 100;

在这里, x只是一个指针,您需要为100分配内存。 例如

int* x = new int;
*x = 100;
std::cout << *x;

要不就

int* x = new int( 100 );
std::cout << *x;

在不分配内存并使x未初始化的情况下,通过*x = 100您尝试更改一些随机内存,这将导致未定义的行为

暂无
暂无

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

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