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]);
}
}
Bài liên quan
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
Ở đâ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 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.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ớiCOUNT = 10
mà vẫn bị lỗi. Những lỗi khác mình có thể giải thích:Nói đơn giản thôi, nếu
sizeof(a) > sizeof(p)
, bạn phải chạy vòng lặp đếnsizeof(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.Có khả năng nào
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.
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: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ùngstd::vector
cho tiện, ít lỗi.