Chương trình C++ này sai ở chỗ nào vậy?

#define COUNT 10
#define MAX(a, b) ((a) < (b) ? (a):(b))
int main()
{
	int *p = new int[COUNT];
	int a[COUNT];

	for (int i = 0; i < sizeof(a); i++)
	{
		a[i] = i;
	}

	for (int i = 0; i < sizeof(a); i++)
	{
		p[i] = i;
	}


	for (int i = 0; i < MAX(sizeof(a), sizeof(p)); i++)
	{
		printf("%d %d\n", a[i], p[i]);
	}
}

Muốn lấy độ dài mảng a thì phải dùng sizeof(a) / sizeof(a[0]) nhé. (kích thước của cả mảng / kích thước 1 phần tử = số phần tử)

lấy kích thước mảng a như này là đúng rồi bạn, sai ở đây là chương trình nó không cho truy xuất vào vùng nhớ p[i] = i; mà mình không hiểu tại sao nó lại không cho truy xuất

Đó là kích thước bộ nhớ. Còn nếu muốn lấy số lượng phần tử trong mảng thì phải làm như mình đã nói.

Kích thước bộ nhớ của mảng = số lượng phần tử (COUNT) * kích thước bộ nhớ của 1 phần tử (int -> 4 byte) > số lượng phần tử (COUNT), mà mảng p bạn chỉ khai báo có COUNT phần tử thôi nên xảy ra việc truy cập ngoài mảng.

Không đúng, sizeof(a) vẫn trả về một số nguyên, vòng lặp vẫn thực hiện, còn với p kể cả mình rút ngắn số vòng lặp đi thì nó vẫn báo lỗi như thế

Ở đây mình không cần tính số phần tử mảng a mà chỉ cần tồn tại 1 số nguyên sao cho vòng lặp có thể thực hiện thôi

Thêm nữa p[i] chạy từ 0, nếu sizeof[a] chạy vượt quá số COUNT thì phải chạy đến vòng lặp > COUNT mới báo lỗi chứ sao vừa vào vòng lặp đã báo lỗi

  • Nếu cmt của bạn có 3 mục cần nói thì bạn viết hết vào 1 cmt, có thể xuống dòng để viết nhiều mục. Đừng cmt như fb.
  • [quote=“Nguyen_Duc_Duy2, post:6, topic:55713, full:true”]
    Ở đây mình không cần tính số phần tử mảng a mà chỉ cần tồn tại 1 số nguyên sao cho vòng lặp có thể thực hiện thôi
    [/quote]

Nếu thế thì bạn dùng COUNT để làm gì?

Bạn tự xem sizeof(a) in ra cái gì. Nó không phải là số lượng phần tử trong mảng đâu.

Bạn đúng rồi, thanks bạn

Mình sửa theo cách của bạn thì thấy chạy được nhưng thực sự vẫn chưa hiểu lỗi này lắm, bạn nói rõ hơn giúp mình được không

Mình không biết tại sao bạn khai báo int *p = new int[COUNT] với COUNT = 10 mà vẫn bị lỗi. Những lỗi khác mình có thể giải thích:

  • Lỗi ở dòng

Nói đơn giản thôi, nếu sizeof(a) > sizeof(p), bạn phải chạy vòng lặp đến sizeof(a) - 1. Mà p đâu có nhiều phần tử đến thế. Chỗ này sinh lỗi.

Đoạn này về cơ bản gần giống đoạn trên.

Ngoài những lỗi đã nêu, code còn sai ở macro MAX.

Nếu thớt sửa lại hết là i < COUNT thì sẽ đúng, chứ sizeof(mảng) chỉ là kích thước mảng.

1 Like

Có khả năng nào

for (int i = 0; i < sizeof(a); i++)
	{
		a[i] = i;
	}

nó khai báo nhiều phần tử quá, thành ra nó chiếm vào vùng nhớ của thằng p được cấp phát sau, vì lí do đấy nên sau không thể truy cập vào vùng nhớ của thằng p[i] không bạn nhỉ

Khi bạn đã ghi tràn ra ngoài thì bất cứ chuyện gì cũng có thể xảy ra. Để trả lời câu hỏi thì bạn kiểm tra lại nội dung của a và p, nhưng OS thông dụng ko ai để stack chung với heap.

1 Like

Theo như mình đọc, có cách để lấy được số lượng của mảng tĩnh (int A[10]) chẳng hạn, bằng cách lấy kích thước của mảng chia cho kích thước 1 phần tử trong mảng, thường lấy phần tử đầu tiên:

int n = sizeof(A) / sizeof(A[0]);

Tuy nhiên đối với con trỏ thì hoàn toàn không có cách nào để lấy được số phần tử trong mảng, trừ khi bạn lưu giữ giá trị dùng để khởi tạo con trỏ. Cách trên không áp dụng được, vì kích thước của con trỏ không phụ thuộc vào kích thước vùng nhớ nó trỏ đến.

Mà, nếu là C thì người ta mới dùng mảng, C++ thì người ta # include <vector> rồi dùng std::vector cho tiện, ít lỗi.

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