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\n", &var  );
  std::cout << &var << '\n';
   printf("Value of *ip variable: %d\n", 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 << '\n';
  std::cout << "number: " << number << '\n';

   int  *ip;
   ip = reinterpret_cast<int*>(number);

   /* address stored in pointer variable */
   printf("Address: %x\n", ip );

   /* access the value using the pointer */
   printf("Value: %d\n", *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

2 Likes

Đọc thì thấy giống con trỏ.Nếu là con trỏ thì đơn giản !!!

1 Like

:blush: 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 ạ :smiley: )

1 Like

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 ?

1 Like

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

2 Likes

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;

2 Likes

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.

4 Likes

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?

2 Likes

Mình ko hiểu ý bạn lắm :sweat:
Ý là bạn muốn lấy value từ cái địa chỉ nhập vào?

3 Likes

Đúng vậy nhập địa chỉ của biến đã khởi tạo và lấy giá trị của nó

2 Likes

Mình thấy làm nhwu trên là đúng r.
Và mình test trên DevC++ ok lắm :smiley:
Nên còn sai là sai cái địa chỉ lúc bạn nhập thôi.

3 Likes

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

1 Like

:smiley: Test ok nhé

3 Likes

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ỉ?

C:\Users\mdev\Desktop>test
Address of var variable: 28ff20
0x28ff20
Value of *ip variable: 1
Insert your full address: 0x28ff20
hex: 0x28ff20
number: 2686752
Address: 28ff20
Value: 1
2 Likes

Bạn thử nhập cái

Address of var variable: 49cc2654

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 :sweat_smile:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?