1. 程式人生 > >強制轉換const型別指標

強制轉換const型別指標

原題來自阿里筆試,程式碼如下:

#include <cstdio>

int main()
{
    const int val = 9;
    int *p = (int *)&val;
    *p = 10;

    printf("%d ", val);  // 輸出為9
    printf("%d", *p);    // 輸出為10

    return 0;
}

除錯發現&val與p相同,但值卻不同,很奇怪,反彙編程式碼如下:

0x00401334  push   %ebp
0x00401335  mov    %esp,%ebp
0x00401337  and    $0
xfffffff0,%esp 0x0040133A sub $0x20,%esp 0x0040133D call 0x401940 <__main> 0x00401342 movl $0x9,0x18(%esp) // const int val = 9; 0x0040134A lea 0x18(%esp),%eax // int *p = (int *)&val; 0x0040134E mov %eax,0x1c(%esp) 0x00401352 mov 0x1c(%esp),%eax // *p = 10; 0x00401356 movl $0xa,(%eax) 0x0040135C movl $0x9,0x4
(%esp) // printf("%d", val); 0x00401364 movl $0x408024,(%esp) 0x0040136B call 0x4069ec <printf(char const*, ...)> 0x00401370 mov 0x1c(%esp),%eax // printf("%d", *p); 0x00401374 mov (%eax),%eax 0x00401376 mov %eax,0x4(%esp) 0x0040137A movl $0x408028,(%esp) 0x00401381 call 0x4069ec <printf(char const*, ...)> 0x00401386
mov $0x0,%eax 0x0040138B leave 0x0040138C ret

可以發現在使用val時,並不是從記憶體中取對應位置的值而是直接用立即數,而*p則使用最開始給val分配的記憶體。推測編譯器會把所有常量做替換(類似巨集替換),但仍然保留了const型別變數的記憶體。

相關推薦

強制轉換const型別指標

原題來自阿里筆試,程式碼如下: #include <cstdio> int main() { const int val = 9; int *p = (int *)&val; *p = 10; pri

無法將型別為“DAL.LoginDAL”的物件強制轉換型別“IDAL.ILogin”的解決方法

   無法將型別為“DAL.LoginDAL”的物件強制轉換為型別“IDAL.ILogin”      解決方法:         1.執行後Factory

區分“const型別指標”和“指向const型別指標”小技巧

C++中我們常常會遇到下面的兩種寫法: const int * a; int * const b; 這兩種寫法明顯代表不同的涵義 第一種代表指向一個整形常量的指標 第二種代表一個指向整形的指標常量 第一種const修飾的是整形,意味著指標所指向的整形是不可以改

NotSupportedException-無法將型別“System.DateTime”強制轉換型別“System.Object”

幾張圖就可以說明一切 2015-03-29 21:54:09,206 [77] ERROR log - System.NotSupportedException: 無法將型別“System.DateTime”強制轉換為型別“System.Object”。LINQ to Entities 僅支

【Winform】 無法將型別為“System.Windows.Forms.SplitContainer”的物件強制轉換型別“System.ComponentModel.ISupportInitialize”。

問題:將dotnet framework 4.0 切換到2.0時,編譯沒有問題,在執行時出現如下錯誤:System.InvalidCastException: 無法將型別為“System.Windows

關於對 (char *)字元指標強制轉換型別的一些理解

關於 char * 的問題我在下面的兩篇博文中均有提及,如果本文看了不夠爽的,可盡情翻閱我的這兩篇,相信您的感受定會如我一般。 真TM神奇 宣告:short 在我的機器中是2個位元組。 #include <stdio.h> #i

強制型別(結構體)轉換NULL-----C指標的黑科技

一個頭疼的例子(改寫自Tencent—libco) #include<stdio.h> #include<string.h> typedef struct aa{ char a; int b; char o[3]

成員函式指標和其他型別強制轉換,使用一般指標呼叫成員函式

 成員函式指標和其他型別之間的轉換,參見如下示例: class test...{public:    void t()...{};};typedef   void   (test::*pMemFnction)(); int main()...{    pMemFnction

Java中型別強制轉換的問題

型別轉換 boolean不能轉換成其他型別的資料型別 預設轉換 byte,short,char——int——long——float——double byte,short,char相互之間不轉換,參與運算首先轉換成int型別 強制轉

資料型別強制轉換

1、轉字串 其實在js中,一切資料除了null 和undefined之外都自帶一個函式,toString,看這個toString,任何東西都有這個toString ,比如 任何東西,都有toString 函式,toString函式可以將任何型別轉換為string型別。 咱

js資料型別強制轉換--轉換為Boolean

將其他的資料轉換為Boolean                 -使用Boolean()函式         &n

js資料型別強制轉換--轉換為number

將其他的資料型別轉換為Number         轉換方式一:             使用Number()函式   

js資料型別強制轉換--轉換為String

強制型別轉換     -指的是將一個數據型別轉換為其他資料型別     -型別轉換主要是指,將其他的資料型別,轉換為             St

js中的資料型別以及資料型別之間的強制轉換

資料型別:     資料型別指的就是字面量的型別     在JS中一共有六種資料型別         String  字串      &

JavaScript資料型別強制轉換

javascript資料型別分為基本資料型別和引用資料型別 基本資料:Number, Boolean, Undefined, Null, String; 引用資料:Object; 當0.000…01,小數點後大於等於7位時會自動轉換成科學計數法 當20000…

牛客網——const二級指標報錯: 無法從“int **”轉換為“const int **”

喵哥在牛客網遇到這麼一題選擇題: class A { }; void f(const A** p) {} void g(const A * const *p) {} void k(const A*&p) {} int main() { const A * ca = new A();

無法將型別為“*Class”的 COM 物件強制轉換為介面型別 失敗原因.

在用.net2.0呼叫COM的某方法時報: System.InvalidCastException: 無法將型別為“*Class”的 COM 物件強制轉換為介面型別“I*”。此操作失敗的原因是對 IID 為“{BBB9E30B-B4EB-4560-B5A7-1B59B33EF

物件的屬性名會被強制轉換成字串型別

今天在看ES6中的Map時看到了這句話 var sample = { 1 : "abc", 5 : 100 }; console.log("sample 5 is: " + sample[5]); console.log("sample 5 is: " + sample["5

是否瞭解printf("%s",....)與printf("%c",...)的區別,指標強制轉換成一維指標和二維指標甚至多維指標時如何正確使用

程式碼1:  #include <stdio.h> #define va_list void* #define va_start(arg, start) arg = (va_list)( ((char*)&start) + sizeof(start

char*指標強制轉換成一個指向結構體的指標

test *a = (test*) pData;      //定義一個結構體指標,並把char*快取區強制轉換成結構體指標a->a = 1;                           //可以對快取區進行賦值,這可以理解為包頭資訊寫入到快取區a->b = 2.0;a->c = '