01/10/2018, 16:05
Cho em hỏi về con trỏ trong C
#include <stdio.h>
int main(){
int x = 10; int y = 4;
int *p = &x; //Gan con tro p voi dia chi cua bien x
p--; // -- di thi se gan con tro p vao dia chi bien y
printf("%d", *p);
}
Cho em hỏi tại sao khi nó in ra nó không in ra 4 (giá trị của y vậy ạ), em chưa hiểu em sai ở đâu.
Bài liên quan
Cách tổ chức bộ nhớ sẽ khác nhau chẳng có lí do gì để y luôn nằm sau x cả.
Suy nghĩ khác với hành động vậy bạn ???
Suy nghĩ:
Hành động:
Cái kiểu
*p, p--
chỉ làm được khi nào bạn biết mấy cái variables sẽ ở cạnh bên nhau trong memory thôi (như array chẳng hạng).Còn bạn declared cái variable
x
andy
này thì máy của bạn cũng sẽ lưu tụi nó lại trong memory, nhưng kế bên nhau hay không thì chỉ có mình nó biết thôi. Thường thìx
vày
sẽ lưu ở 2 chỗ khác nhau. Nên bạn in ragarbage value
là vậy.nếu bạn hiểu về cấu trúc stack mình sẽ giải thích như sau
int x = 10
thực chất là đưa 10 vào vị trí ESP - 4 (ESP là con trỏ của stack)
int y = 4 thực chất là đưa 4 vào vị trí ESP - 8 (ESP là con trỏ của stack)
(tại sao là -8 vì biến của sự khai báo là Int mà int là có độ lớn dữ liệu thực sự là 4 byte)
dĩ nhiên nếu int z= 1 chất là đưa 1 vào vị trí ESP - C (ESP là con trỏ của stack) (C=8+4byte tiếp theo)
thì p=p-2 () lúc này *p sẽ mang giá trị là 1
=> điều bot muốn nói là khi C biên dịch thanh mã máy ta dùng Assembly để đọc mã đấy thì sẽ tường minh tất cả vì câu hỏi có mụch đích hướng đến cội nguồn của sự thật nên mình tạm thời đề cập
giải quyết lỗi đó
*p = *p -1;
bạn nào giải thích giùm tại sao code như này lại ra đúng còn như post 1 của @GaConXYZ lại không ra ???