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

Đề tài: Hỏi về con trỏ trong C

  1. #1
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Mặc định Hỏi về con trỏ trong C

    Các bro cho em hỏi phát này:
    em có một đoạn chương trình sau:
    C Code:
    1. char *function()
    2. { char *tmp;
    3. // đây là các lệnh
    4.  
    5. return tmp;
    6. }
    cho em hoi là làm như trên có được hay không???
    vì theo em hiểu thì sau khi ra khỏi hàm biến tmp sẽ bị xóa, nếu return thì cũng chỉ là địa chỉ chứ không có nội dung.
    Muốn làm câu lệnh trả lại nội dung của string vào tên hàm thì phải làm thế nào???
    Thanks
    Đã được chỉnh sửa lần cuối bởi quangnh89 : 10-04-2008 lúc 01:42 PM.

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

    - Ăn thua jì đâu nhỉ?Cái form bạn đề nghị đúng rồi!Nhưng mà đôi khi bạn gặp phải const char * thì phải lưu ý nhé.Phải khai báo thêm một con trỏ trỏ vào nó rồi xử lý....
    No way, No success..

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

    Thực sự thì khi bạn return như vậy là đúng và vẫn cho kết quả mong muốn. Vì char * là một con trỏ, mà đã là con trỏ thì kô thể mất dữ liệu, trừ khi dữ liệu bị xóa, con trỏ bị xóa, hay con trỏ bị set = NULL
    VD:
    C++ Code:
    1. {
    2.    char s[] = "Hello world...";
    3.    char *tmp = &s;
    4.    tmp = "ABCD"; //s = "ABCD"
    5.  
    6.    //return tmp;
    7.    //Nếu return tmp; thì tmp sẽ trỏ đến null, tức là mất dữ liệu rồi
    8.    //vì khi ra khỏi code block {} thì mọi biến dữ liệu
    9.    //(ở VD trên là s, không phải con trỏ như tmp) sẽ bị del
    10.    //nhưng vì tmp trỏ đến s , mà s bị del rồi nên tmp cũng kô còn gì
    11.  
    12.    //Nhưng nếu:
    13.    char *str = "Hello world...";
    14.    return str;
    15.    //thì sẽ return đúng như ý muốn
    16.    //vì con trỏ thì sẽ kô bị del mặc dù đã ra khỏi code block {}[/INDENT]

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    C Code:
    1. char* new_string = new char[...]
    2. char* ptr = new_string;
    Or :
    C Code:
    1. static char new_string[MAX_SIZE];
    2. char* ptr = new_string;

    //Nhưng nếu:
    char *str = "Hello world...";
    return str;
    //thì sẽ return đúng như ý muốn
    //vì con trỏ thì sẽ kô bị del mặc dù đã ra khỏi code block {}[/indent]
    Chỗ này tại sao không bị del vậy ?

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

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Chỗ này tại sao không bị del vậy ?
    Không hiểu ý "ngầm" của câu hỏi là gì. Nhưng nếu hiểu theo nghĩa thường thì có thể nói như sau:
    Khi tạo một con trỏ mà con trỏ này không trỏ đến một biến (variable) mà được gán như : new string("aaa") thì cái new string("aaa") này nằm trên heap (hình như là vậy, kô nhớ rõ) và khi nó nằm trên này rồi thì nó đang nằm vào vùng nhớ chung của ứng dụng. Và nếu LTV kô xử lý tốt các new ... đã tạo ra thì sẽ gây lãng phí tài nguyên hệ thống, chính vì thế mới có mấy cái vụ auto_ptr hay smartptr của boost hay như mấy cái garabage collector trên codeproject...

    Vài lời như vậy, có gì sai xin bỏ qua...

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Mặc định Hỏi về con trỏ trong C

    Trích dẫn Nguyên bản được gửi bởi quangnh89 Xem bài viết
    Các bro cho em hỏi phát này:
    em có một đoạn chương trình sau:
    C Code:
    1. char *function()
    2. { char *tmp;
    3. // đây là các lệnh
    4.  
    5. return tmp;
    6. }
    cho em hoi là làm như trên có được hay không???
    vì theo em hiểu thì sau khi ra khỏi hàm biến tmp sẽ bị xóa, nếu return thì cũng chỉ là địa chỉ chứ không có nội dung.
    Muốn làm câu lệnh trả lại nội dung của string vào tên hàm thì phải làm thế nào???
    Thanks
    Giả sử như biến con trỏ tmp trong hàm con này trỏ đến 1 biến a ngoài hàm con thi khi thoát khỏi hàm sẽ như sau : biến con trỏ là biến cục bộ , bị huỷ . Biến a ko là biến cục bộ trong hàm này nên ko bị huỷ. Nói tóm lại , con trỏ cũng như là biến bình thường , nó vẫn chịu quy luật bị huỷ như mọi biến bình thường trong hàm con . Có điều nếu như nó đang trỏ đến 1 biến ko là biến cục bộ trong hàm thì biến ấy vẫn live thui .

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

    Trích dẫn Nguyên bản được gửi bởi sieuphuong Xem bài viết
    Giả sử như biến con trỏ tmp trong hàm con này trỏ đến 1 biến a ngoài hàm con thi khi thoát khỏi hàm sẽ như sau : biến con trỏ là biến cục bộ , bị huỷ . Biến a ko là biến cục bộ trong hàm này nên ko bị huỷ. Nói tóm lại , con trỏ cũng như là biến bình thường , nó vẫn chịu quy luật bị huỷ như mọi biến bình thường trong hàm con . Có điều nếu như nó đang trỏ đến 1 biến ko là biến cục bộ trong hàm thì biến ấy vẫn live thui .
    Cám ơn bạn, trước giờ mình vẫn hiểu sai về con trỏ ...

  8. #8
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Chỗ đó cũng vậy bị del như thường, local scope không bảo đảm cho sự tồn tại của pointer. Nếu nói đúng thì phải dùng :
    - new delete
    - malloc free
    - alloc
    - hoặc khai báo static. ( nhưng bộ nhớ trên stack rất giới hạn ) đó là vì sao họ thích dùng heap để manage resource.
    - Còn về auto_ptr của cậu đề cập thì cũng vậy, nếu không có new nó vẫn chỉ là con trỏ thông thường.

  9. #9
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Cám ơn mọi người đã cho ý kiến.

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