Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Không hiểu tại sao bị lỗi

  1. #1
    Ngày gia nhập
    09 2008
    Bài viết
    5

    Mặc định Không hiểu tại sao bị lỗi

    mình có chương trình c đơn giản này
    Code:
    #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ấy pro làm ơn chỉ mình tại sao lại bị lỗi với
    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)

  2. #2
    Ngày gia nhập
    04 2008
    Bài viết
    336

    Mình không thấy lỗi gì cả ...
    code ra gió bão

  3. #3
    Ngày gia nhập
    09 2008
    Bài viết
    5

    ặ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

  4. #4
    Ngày gia nhập
    04 2008
    Bài viết
    336

    Đã tăng N lên 10000 ... có hiện ra "không có lỗi".
    code ra gió bão

  5. #5
    Ngày gia nhập
    09 2008
    Bài viết
    5

    vậy không lẽ tuỳ máy mà nó có lỗi hay ko hả trời

  6. #6
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định Không hiểu tại sao bị lỗ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.

  7. #7
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi zj3t3mju Xem bài viết
    mình có chương trình c đơn giản này
    Code:
    #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ấy pro làm ơn chỉ mình tại sao lại bị lỗi với
    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)
    1. 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.
    Đã đượ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

  8. #8
    Ngày gia nhập
    10 2007
    Bài viết
    3

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

  9. #9
    Ngày gia nhập
    09 2008
    Bài viết
    5

    1. 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.
    không có gì là vội vàng cả, mình không dùng bc 3.1
    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

    Trong win thì ko bị lỗi này vì win nó thu hồi vùng nhớ tốt hơn dos.
    trường hợp của mình bị lỗi ngay lần đầu

    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)
    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 win (chỉ có cái cuối là có cửa sổ báo lỗi hiện lên)

    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.

  10. #10
    Ngày gia nhập
    09 2006
    Bài viết
    711

    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 Code:
    1. a = (int*) malloc(N * sizeof(int));
    2. assert(a != NULL);
    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ó 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.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn