Tìm giá trị biến qua memory address nhập từ console
Nhờ các bạn chỉ giúp mình cách giải quyết bài này với.
Như các bạn biết, khi khai báo biến int i và khởi tạo giá trị nó = x; nó sẽ được gán cho 1 địa chỉ trong memory.
Tuy nhiên, mình chỉ biết address nó (vd. 0x6400) ở dạng string. Làm sao để biết giá trị biến là bao nhiêu?
Hay nói cách khác đây là bài toán convert 1 chuỗi địa chỉ memory đang tồn tại sang kiểu pointer rồi lấy về giá trị biến tại địa chỉ đó.
Đây là code c++ mình đang làm, nó bị lỗi Segmentation fault
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <stdlib.h>
#include <string>
int main () {
int var = 1; /* actual variable declaration */
printf("Address of var variable: %x
", &var );
std::cout << &var << '
';
printf("Value of *ip variable: %d
", var );
char string[100];
printf ("Insert your full address: ");
gets (string);
const char *hexstring;
hexstring = (char *) string;
int number = (int)strtol(hexstring, NULL, 0);
std::cout << "hex: " << hexstring << '
';
std::cout << "number: " << number << '
';
int *ip;
ip = reinterpret_cast<int*>(number);
/* address stored in pointer variable */
printf("Address: %x
", ip );
/* access the value using the pointer */
printf("Value: %d
", *ip );
return 0;
}
output:
$ ./test
Address of var variable: 49cc2654
0x7ffd49cc2654
Value of *ip variable: 1
Insert your full address: 0x7ffd49cc2654
hex: 0x7ffd49cc2654
number: 1238115924
Address: 49cc2654
Segmentation fault
Đọc thì thấy giống con trỏ.Nếu là con trỏ thì đơn giản !!!
Cái này chính là liên quan đến con trỏ đấy.
Cái này giải thích việc tại sao truy cập phần tử của array[1] và array[10000] lại đều là constant time, thay vì nhảy qua từng block của memory để tìm ra giá trị phù hợp thì nó tính toán luôn được ra địa chỉ memory address (vd. int 4 bytes * 100) và trỏ tới.
Các cao thủ C/C++ giúp với @ltd (lâu rồi quay lại diễn đàn bác Đạt ạ )
Mình không hiểu ý bạn lắm. Địa chỉ khác, giá trị khác, sao convert được nhỉ ?
1 biến có 2 phần là địa chỉ và giá trị.
Địa chỉ là 1 số hexa gồm 8 ký tự.
Còn giá trị mình phải gán cho nó mới có, không là giá trị rác hoặc 0.
Muốn lấy địa chỉ của nó thì phải để
%p
chứ sao%x
?%x
thực chất là đổi nó sang dạng hexa ?Thay cái 0 thành 16 đi
Còn ko thì nhập với tiền tố 0x vào lúc nhập
Bên dưới mình có dòng này để in ra giá trị tương đương %p rồi.
std::cout << &var << '\n';
Nhu trong code của mình, nếu chạy thử sẽ thấy nó in ra địa chỉ của biến int var = 1;
rồi mình nhập địa chỉ đấy vào (bao gồm cả 0x) , tuy nhiên sau khi cố gắng convert nó thành pointer và lấy giá trị của nó ra thì bi lỗi Segmentation fault;
Bởi vì địa chỉ bạn nhập bị sai
Địa chỉ ở ví dụ (0x7xxxxxxx) trên đổi ra hệ 10 thì cỡ 140 nghìn tỷ. !!!
Bạn gán vào int là tạch 1 nháy rồi.
Vì gán long vào int -> sai số -> Địa chỉ bị trỏ bậy -> có thể vô vùng nhớ ko cho phép.
Cảm ơn bạn.
Mình cũng nghĩ có lỗi ở đấy nhưng không biết làm sao để convert sang pointer kiểu int , nếu để khác kiểu int thì không ép kiểu được. Bạn có ý tưởng gì xử lý chỗ này không?
Mình ko hiểu ý bạn lắm
Ý là bạn muốn lấy value từ cái địa chỉ nhập vào?
Đúng vậy nhập địa chỉ của biến đã khởi tạo và lấy giá trị của nó
Mình thấy làm nhwu trên là đúng r.
Và mình test trên DevC++ ok lắm
Nên còn sai là sai cái địa chỉ lúc bạn nhập thôi.
Bạn thử chụp cho xin cái hình bạn chạy với. Vì mình chạy o local toàn lỗi
Test ok nhé
Cảm ơn bạn !
Mình vừa thử trên Windows thấy cũng chạy được, như vậy địa chỉ biến ở trên Linux quá dài, có cách nào xử lý vấn đề này cho linux ko nhỉ?
Bạn thử nhập cái
thay vì cái dài kia :?
Nếu ko đc nữa thì mình chịu thua, do mình ko lành linux