Mình không thấy lỗi gì cả ...
mình có chương trình c đơn giản này
mấy pro làm ơn chỉ mình tại sao lại bị lỗi vớiCode:#include <stdlib.h> #include <stdio.h> #define N 1000 int main() { int *a=(int*)malloc(N); int i; //printf(""); for (i=0;i<N;i++) a[i]=i; printf("Khong co loi\n"); return 0; }
mình nghĩ chắc nó có liên quan đến asm, nhưng ko hi vọng thế
nếu bỏ dấu comment ở hàm printf(""); thì nó chạy bình thường
nhưng nếu để như trên thì bị lỗi
nếu thay malloc(N) = malloc(N+ num), với num lớn gấp 3-4 lần N thì nó không bị lỗi (nhưng nếu dùng assert vẫn báo lỗi)
Mình không thấy lỗi gì cả ...
code ra gió bão
ặc ặc, sao lại thế, khi chạy nó có in ra dòng "khong co loi" không?
đã test trên 2 máy khác nhau rùi
máy nhà thì nó hiện lên bản báo lỗi
máy tiệm thì không nên mới thêm vào cái printf ở cuối
à, return code của nó là -1073741819 (0xC0000005)
hay là thử tăng N lên 2000 xem
Đã tăng N lên 10000 ... có hiện ra "không có lỗi".
code ra gió bão
vậy không lẽ tuỳ máy mà nó có lỗi hay ko hả trời
Nếu dùng BC31 trong DOS thì chạy lần đầu ko có lỗi, lần sau sẽ báo not enough memory. Cái này là do bạn cấp phát bộ nhớ mà ko chịu trả nên mới bị lỗi. Trong win thì ko bị lỗi này vì win nó thu hồi vùng nhớ tốt hơn dos.
Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.
Đã được chỉnh sửa lần cuối bởi langman : 07-09-2008 lúc 10:51 PM.
^_,^
Facebook : https://www.facebook.com/langmaninternet
Bùi Tấn Quang
Định hỏi cái free(N); thì đã có bạn hỏi rồi ! Cấp phát mà ko free nó thì tràn là đúng ồi.
không có gì là vội vàng cả, mình không dùng bc 3.11. free của bạn đâu ?????
2. khi bạn cấp phát bạn đã kiểm tra xem việc cấp phát đã thành công hay chưa ?????? Đừng kết luận vội vàng.
mình sử dụng GNU C, cũng test trên Microsoft C
mình nghĩ là đã cấp phát thành công vì a!=NULL nếu mình đúng (mình không ghi nhiều vì không muốn rắc rối)
Vả lại, khi debug thì mình đã xác định là do khi malloc nó không cấp phát đủ N phần tử,
khi i tăng lên đến 1 số nào đó thì nó sẽ gây ra lỗi, chứ không gây ra lỗi ở phần tử đầu tiên
trường hợp của mình bị lỗi ngay lần đầuTrong win thì ko bị lỗi này vì win nó thu hồi vùng nhớ tốt hơn dos.
do mấy bạn không tin thế nên mình sửa lại tí xíu cho phù hợp
và kết quả của nó luôn: (có cả kết quả trên Linux và Wine)
Kết quả trên win (chỉ có cái cuối là có cửa sổ báo lỗi hiện lên)Code:#include <stdlib.h> #include <stdio.h> #include <assert.h> #define N 1000 int main() { int *a=(int*)malloc(N); int i; for(i=0;i<N;i++) assert(a[i]=i); free(a); return 0; }
Kết quả trên linux
Đã được chỉnh sửa lần cuối bởi zj3t3mju : 08-09-2008 lúc 03:27 PM.
assert làm gì vậy bạn, đk nào thì assert sẽ quăng error vậy ?
Với i = 0 thì bt a[i] = i sẽ có giá trị gì ?
Code phải sửa lại thành:
Cậu cấp N = 1000 tức chỉ có 1000 byte = 250 int (sizeof(int) = 4). Vòng for của cậu truy xuất ngoài vùng memory cấp phát, từ 250 - 999.C Code:
Đã có cấp phát thì phải có giải phóng. Nên tuân theo điều này. Memory luôn giới hạn, không phải vô tận và luôn kiểm tra cấp phát bộ nhớ có thành công không.
Đã được chỉnh sửa lần cuối bởi TQN : 08-09-2008 lúc 05:19 PM.