Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Lỗi do cấp phát bộ nhớ? Cấp phát bộ nhớ trong C

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

    Mặc định Lỗi do cấp phát bộ nhớ? Cấp phát bộ nhớ trong C

    C Code:
    1. void func1(int *a)
    2. {
    3.     *a=3;
    4. }
    5. void main(int agrc, char **argv)
    6. {
    7.     int a;
    8.     func1(&a);
    9. }

    Ví dụ như vậy nhé, nhưng mình chạy chương trình trong Cygwin thì bị lỗi. mình nghĩ là biến a cần phải cấp bộ nhớ cho nó, vì nếu cấp phảt trong hàm func1 bằng hàm malloc thì không lỗi mà chạy kết quả cũng không đúng. Ai gặp vấn đề này giúp mình ha!
    Đã được chỉnh sửa lần cuối bởi long.bkiter07 : 20-04-2009 lúc 08:08 PM.

  2. #2
    Ngày gia nhập
    11 2008
    Nơi ở
    Hà Nội
    Bài viết
    70

    Bạn thử để *a=3 xem sao.
    Dân thường sống đẹp đè bẹp dân chơi.
    Hi [you]

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

    à mình viết nhầm đó, *a=3 vẫn bị

  4. #4
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    bó tay:

    int a; <--- thì a là kiểu int bình thường

    void func1(int *a) <--- cái này là tham số là con trỏ

    => làm sao mà lại cho func1(&a); được ...
    Một cái là tham chiếu, 1 cái là con trỏ...bó chiếu..=___+

    Cho cậu 1 ví dụ đây
    C Code:
    1. #include <stdio.h>
    2. #include <malloc.h>
    3. #include <stdlib.h>
    4.  
    5. // con tro
    6. void func1(int *a)
    7. {
    8.     *a = 3;
    9. }
    10.  
    11. // tham chieu
    12. void func2(int &b)
    13. {
    14.     b = 10;
    15. }
    16.  
    17. int main(void)
    18.  
    19. {
    20.     int *a = (int*) malloc(sizeof(int));
    21.     int b;
    22.  
    23.     if ( NULL == a ) {
    24.         printf("ERROR MEMORY LOCATE ! \n");
    25.         exit(-1);
    26.     }
    27.  
    28.     func1(a); // con tro
    29.     func2(b); // tham chieu
    30.     printf("Gia tri a la: %d\n", *a);
    31.     printf("Gia tri b la: %d\n", b);
    32.  
    33.     return 0;
    34. }
    None!

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

    Hì, bạn thử chạy code trên xem được không nhé!
    Thực chất thì code này chạy không sai, mình chỉ trích một phần trong bài tập hệ điều hành thôi, tưởng sai chỗ này mà không hiểu tại sao, hóa ra sai chỗ khác :P
    Tham chiếu và con trỏ thì sao bạn? Nên nhớ là hệ thống chỉ có 2 định nghĩa: địa chỉ và giá trị. Hàm func1(int *a) thì nếu ta khai báo ở hàm main một con trỏ là *a và cấp phát bộ nhớ cho nó, tức là biến này được lưu ở vùng heap, thì ta có thể gọi func1(a) (tức là truyền địa chỉ của con trỏ thôi). Tuy nhiên nếu ta khai báo int a, nghĩa là biến được lưu ở vùng stack, thì có thể sử dụng func1(&a), vẫn là truyền địa chỉ của một biến thôi.
    Nếu không tin bạn thử code vài dòng như vậy và chạy nhé!

  6. #6
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định Lỗi do cấp phát bộ nhớ? Cấp phát bộ nhớ trong C

    Trích dẫn Nguyên bản được gửi bởi long.bkiter07 Xem bài viết
    Hì, bạn thử chạy code trên xem được không nhé!
    Thực chất thì code này chạy không sai, mình chỉ trích một phần trong bài tập hệ điều hành thôi, tưởng sai chỗ này mà không hiểu tại sao, hóa ra sai chỗ khác :P
    Tham chiếu và con trỏ thì sao bạn? Nên nhớ là hệ thống chỉ có 2 định nghĩa: địa chỉ và giá trị. Hàm func1(int *a) thì nếu ta khai báo ở hàm main một con trỏ là *a và cấp phát bộ nhớ cho nó, tức là biến này được lưu ở vùng heap, thì ta có thể gọi func1(a) (tức là truyền địa chỉ của con trỏ thôi). Tuy nhiên nếu ta khai báo int a, nghĩa là biến được lưu ở vùng stack, thì có thể sử dụng func1(&a), vẫn là truyền địa chỉ của một biến thôi.
    Nếu không tin bạn thử code vài dòng như vậy và chạy nhé!
    Ối zời, pa hiểu được thế này mà vẫn còn phải hỏi ở trên "Lỗi cấp phát bộ nhớ" <=== thế này mới tài chứ.

    Cái này chính là câu trả lời cho cái topic của cậu đó cha nội
    None!

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

    hì hì, thời bởi vậy mới lên đây hỏi, tưởng là mình hiểu sai gì đó, do trước giờ toàn viết C++, vừa chuyển qua C nên hơi choáng. Đã vậy có người không hiểu rõ lại còn phán bậy 1 câu tham chiếu và con trỏ >"<, lại còn là support staff nữa chứ, thất vọng tràn trề T_T
    Đã được chỉnh sửa lần cuối bởi long.bkiter07 : 21-04-2009 lúc 04:35 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