01/10/2018, 11:54

Mọi người cho hỏi 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
", a[i], p[i]);
	}
}
HK boy viết 14:08 ngày 01/10/2018

sizeof(a)

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

Công Thành Chiến viết 13:58 ngày 01/10/2018

sizeof(a) / sizeof(a[0])

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

HK boy viết 13:58 ngày 01/10/2018

lấy kích thước mảng a như này là đúng rồi bạn

Đó 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.

Công Thành Chiến viết 13:55 ngày 01/10/2018

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ế

Công Thành Chiến viết 14:09 ngày 01/10/2018

Ở đâ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

Công Thành Chiến viết 14:07 ngày 01/10/2018

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

HK boy viết 14:09 ngày 01/10/2018
  • 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ì?

Ideone.com

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.

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.

Công Thành Chiến viết 14:07 ngày 01/10/2018

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

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

Công Thành Chiến viết 14:03 ngày 01/10/2018

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

HK boy viết 14:00 ngày 01/10/2018

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
for (int i = 0; i < MAX(sizeof(a), sizeof(p)); i++)

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.

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

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

rogp10 viết 13:55 ngày 01/10/2018

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.

Công Thành Chiến viết 14:06 ngày 01/10/2018

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ỉ

rogp10 viết 14:04 ngày 01/10/2018

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.

Trần Hoàn viết 14:04 ngày 01/10/2018

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.

Bài liên quan
0