簡體   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