#include <iostream>
using namespace std;
int main()
{
int *i;
i=(int*)malloc(sizeof(int));
...
//用cin或scanf输入i的值,即输入给定的地址
...
return 0;
}
试过用cin>>i
或scanf("%d",&i)
都不行,应该怎样写?
阿神2017-04-17 13:02:41
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;
}
伊谢尔伦2017-04-17 13:02:41
問題不夠清晰。
你要給i賦值嗎?你這樣做了會使你malloc的位址,無法再被引用到,這會記憶體洩漏的。就是我們平常說的野指針。
如果你是想讓使用者輸入的內容直接存到這段記憶體中,那麼scanf("%d",i)
,因為i本來就是個位址,這裡不用&i.
如果你是想做在使用者指定的地址申請一段內存,那麼可以告訴你沒有這種需求的。我們用的位址都是虛擬位址,是系統分配的,不是隨便哪個位址都能用的。但是c語言很靈活,他並沒有從語言層面限制你,那麼非這樣做的話會有以下可能:
1.這段內存操作系統會保護的,直接報內存錯誤,程式崩潰。
2.你不知道改了哪裡的內存,反正讀寫正常,而且運行也沒錯,但是這種情況更危險,這是顆定時*,你永遠不知道什麼時候這段被踩的內存會錯亂,而且可能連續反應,整個呼叫棧被踩的稀巴爛,定位都沒辦法定位。大型程式都是這麼崩潰的。