#include <iostream> using namespace std; int main() { int *i; i=(int*)malloc(sizeof(int)); ... //用cin或scanf输入i的值,即输入给定的地址 ... return 0; }
试过用cin>>i或scanf("%d",&i)都不行,应该怎样写?
cin>>i
scanf("%d",&i)
闭关修行中......
scanf沒有輸入指標類型的方法,因此輸入數字再轉換成位址。測試程式碼和結果如下(8866的十六進位表示為22A2):
int main(){
int *i; int i_temp; i=(int*)malloc(sizeof(int)); printf("i的地址为:%p\n",i); printf("请输入i的地址:"); scanf("%d",&i_temp); i=(int*)i_temp; printf("赋值后i的地址为:%p\n",i);
return 0;}
輸入數字,然後強制轉換(
問題不夠清晰。 你要給i賦值嗎?你這樣做了會使你malloc的位址,無法再被引用到,這會記憶體洩漏的。就是我們平常說的野指針。
如果你是想讓使用者輸入的內容直接存到這段記憶體中,那麼scanf("%d",i),因為i本來就是個位址,這裡不用&i.
scanf("%d",i)
如果你是想做在使用者指定的地址申請一段內存,那麼可以告訴你沒有這種需求的。我們用的位址都是虛擬位址,是系統分配的,不是隨便哪個位址都能用的。但是c語言很靈活,他並沒有從語言層面限制你,那麼非這樣做的話會有以下可能:1.這段內存操作系統會保護的,直接報內存錯誤,程式崩潰。 2.你不知道改了哪裡的內存,反正讀寫正常,而且運行也沒錯,但是這種情況更危險,這是顆定時*,你永遠不知道什麼時候這段被踩的內存會錯亂,而且可能連續反應,整個呼叫棧被踩的稀巴爛,定位都沒辦法定位。大型程式都是這麼崩潰的。
翻翻cin的手冊不就行了嗎?
cin >> *i;
scanf沒有輸入指標類型的方法,因此輸入數字再轉換成位址。測試程式碼和結果如下(8866的十六進位表示為22A2):
include
int main()
{
return 0;
}
輸入數字,然後強制轉換(
問題不夠清晰。
你要給i賦值嗎?你這樣做了會使你malloc的位址,無法再被引用到,這會記憶體洩漏的。就是我們平常說的野指針。
如果你是想讓使用者輸入的內容直接存到這段記憶體中,那麼
scanf("%d",i)
,因為i本來就是個位址,這裡不用&i.如果你是想做在使用者指定的地址申請一段內存,那麼可以告訴你沒有這種需求的。我們用的位址都是虛擬位址,是系統分配的,不是隨便哪個位址都能用的。但是c語言很靈活,他並沒有從語言層面限制你,那麼非這樣做的話會有以下可能:
1.這段內存操作系統會保護的,直接報內存錯誤,程式崩潰。
2.你不知道改了哪裡的內存,反正讀寫正常,而且運行也沒錯,但是這種情況更危險,這是顆定時*,你永遠不知道什麼時候這段被踩的內存會錯亂,而且可能連續反應,整個呼叫棧被踩的稀巴爛,定位都沒辦法定位。大型程式都是這麼崩潰的。
翻翻cin的手冊不就行了嗎?