30/09/2018, 21:26

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

The Wind viết 23:41 ngày 30/09/2018

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

Tom Nguyen viết 23:30 ngày 30/09/2018

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 ạ )

Người bí ẩn viết 23:37 ngày 30/09/2018

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.

printf("Address of var variable: %x\n", &var );

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 ?

*grab popcorn* viết 23:30 ngày 30/09/2018

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

Tom Nguyen viết 23:29 ngày 30/09/2018

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

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;

*grab popcorn* viết 23:41 ngày 30/09/2018

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.

Tom Nguyen viết 23:26 ngày 30/09/2018

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?

*grab popcorn* viết 23:36 ngày 30/09/2018

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?

Tom Nguyen viết 23:34 ngày 30/09/2018

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

*grab popcorn* viết 23:42 ngày 30/09/2018

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.

Tom Nguyen viết 23:33 ngày 30/09/2018

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

*grab popcorn* viết 23:33 ngày 30/09/2018

Test ok nhé

Tom Nguyen viết 23:35 ngày 30/09/2018

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
*grab popcorn* viết 23:26 ngày 30/09/2018

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

Bài liên quan
0