Lưu trữ vùng nhớ của kiểu kí tự trong C++

Mình có mấy đoạn code sau:

void trongHam(char* p1) { // trong ham thi bien p1 kieu char* se duoc luu tren Stack hay vung nho khac?(data segments ,..)
}// va minh thu thi khong the dung delete cho p1 --> co le khong luu tren heap segments.

void trongHam(char p1[50]) {
}// minh lam them cai nay va thu chay thi ham nay voi ham tren la mot --> luu tru doi so p1 la nhu nhau.

char p2[50]; // co phai p2 luu tru tren data segments va duoc khoi tao mac dinh la "" (kieu BSS)?;
char p3[50] = (char*)"Hanh phuc cua tri thuc.";//co phai p3 duoc luu tru tren data segments va da duoc khoi tao.

int main() {
	char p4[50]; // co phai p4  la luu tru tren stack khong?
	char* p5 = new char();// chac p5 la luu tru tren heap segments? va phai tu quan ly vung nho (phai delete(p4) khi ket thuc).
//	p5 = new char();
	delete(p5);	
	
	//Dieu cuoi cung la viec tro toi vung nho cua no se kiem soat nhu the nao. Cu the la su khac nhau giua 
	//viec dung *p5 va p5 (chang han) se tro toi vung nho kieu gi?
	//Viec viet cout << &p5; la lay dia chi vung nho heap ma p5 tro toi hay vung nho tren Stack cua bien p5?
	// co cach nao de lay ca vung nho cua bien p5 tren Stack va ca tren heap ma no tro toi.
}

Thanks.

Nên chia nhỏ vấn đề ra để hỏi thì sẽ dễ hơn, mình sẽ trả lời từ từ nhé:

  1. p2 và p3 sẽ được lưu trên data segment do nó là global variables (tham khảo thêm Vùng nhớ Stack trong C?)
  2. p4 nằm trên stack
  3. sizeof(char) byte(s) sẽ được tạo trên heap segment, và thêm 4 hoặc 8 bytes được tạo trên stack để lưu trữ địa chỉ con trỏ tùy vào platform 32 hoặc 64 bits
  4. xem trả lời ở câu 3, p5 là con trỏ chỉ tới vùng nhớ trên heap, *p5 là giá trị của vùng nhớ trên heap (kiểu char)
  5. p5 là địa chỉ của vùng nhớ trên heap, còn &p5 là địa chỉ của con trỏ p5 trên stack (hi nếu khó hiểu thì hỏi thêm nhé)
  6. Hỏi: // trong ham thi bien p1 kieu char* se duoc luu tren Stack hay vung nho khac?(data segments ,…)
    Trả lời: đọc kĩ link tại câu 1, câu trả lời là stack

Lưu ý: p2 & p3 có thể bị optimize bởi compiler nếu không dùng đến

2 Likes

Bạn cho minh hỏi:
4.xem trả lời ở câu 3, p5 là con trỏ chỉ tới vùng nhớ trên heap, *p5 là giá trị của vùng nhớ trên heap (kiểu char)

Tại sao khi mình:

cout << p5 ;// nó ra một chuỗi.
cout << *p5;// nó ra một kí tự của chuỗi (kí tự đầu tiên). --> liệu đây có phải là địa chỉ lưu trên vùng heap, theo mình biết thì địa chỉ là dạng hệ cơ số 16 chứ sao lại là một chuỗi nhỉ?

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