強制轉換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 = '