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

Đề tài: Cho mình hỏi cách khai báo mảng kiểu con trỏ

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

    Mặc định Cho mình hỏi cách khai báo mảng kiểu con trỏ

    Cho tôi hỏi 2 câu nhé !

    1. Tôi đọc thấy tài liệu nào cũng bảo kiểu int có dung lượng 2 bytes vậy mà lúc
    PHP Code:
    cout << sizeof(int); 
    sao nó lại ghi ra là 4 bytes nhỉ ???

    2. Nếu dùng con trỏ khai báo mảng :

    Cách 1:
    PHP Code:
    ...
            
    int *head = new int[4], *p;
            for ( 
    p=head p<head+p++ )
                  
    cin >> *p;
    ... 
    Cách 2:
    PHP Code:
    ...
            
    int *len, *= new int;
            
    len p+4;
            for (    ; 
    p<len p++ )
                  
    cin >> *p;
    ... 
    Cách 3:
    PHP Code:
    ...
            
    int *= new inti;
            for ( 
    i=i<i++ )
                  
    cin >> *(p+i);
    ... 

    Theo tôi hiểu là thế này:
    - Cách 1: Cấp phát 16 bytes cho biến con trỏ head. Lúc đầu địa chỉ con trỏ p được gán bằng địa chỉ con trỏ head rồi sau mỗi lần cin thì p tăng dần đến khi 16 bytes đều được ghi hết.

    - Cách 2: Cấp phát 4 bytes cho biến con trỏ p. (cin >> *p), p tăng... Kết thúc quá trình nhập thì chỉ có 2 biến con trỏ: len và (p+4)

    - Cách 3: Như cách 2. Chỉ khác khi kết thúc quá trình nhập thì có các biến: i,p,p+1,p+2,p+3,p+4.
    Vậy cho tôi hỏi: ở cách 2 và 3 thì 4 bytes kế tiếp được dùng để cin trong lần thứ 2 là 4 bytes trống bất kì trong bộ nhớ chứ không phải là 4 bytes liền kề ngay sau 4 bytes trước. Hiểu như vậy có đúng ko ? Trong 3 cách trên thì dùng cách 1 là tốt nhất phải ko ? vì bộ nhớ đã cấp phát sẵn 16 bytes roài, không sợ p trỏ lung tung như trong cách 1 và 2.

    Mình mới học nên diễn đạt kém, dài dòng ! Mong mọi người giúp đỡ ! Thankssssss !

    Thôi rồi ! post nhầm box rồi ! Nhờ mod chuyển sang box "Hỏi đáp kĩ thuật C++ ", xin lỗi nhé !
    Đã được chỉnh sửa lần cuối bởi chocolate1 : 24-02-2008 lúc 09:55 AM. Lý do: post sai box T.T

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

    1. Tôi đọc thấy tài liệu nào cũng bảo kiểu int có dung lượng 2 bytes vậy mà lúc
    Các complier C++ sau này kiểu int đều 4 bytes.
    Cách 3: Như cách 2. Chỉ khác khi kết thúc quá trình nhập thì có các biến: i,p,p+1,p+2,p+3,p+4.
    Vậy cho tôi hỏi: ở cách 2 và 3 thì 4 bytes kế tiếp được dùng để cin trong lần thứ 2 là 4 bytes trống bất kì trong bộ nhớ chứ không phải là 4 bytes liền kề ngay sau 4 bytes trước. Hiểu như vậy có đúng ko ? Trong 3 cách trên thì dùng cách 1 là tốt nhất phải ko ? vì bộ nhớ đã cấp phát sẵn 16 bytes roài, không sợ p trỏ lung tung như trong cách 1 và 2.
    Phần này tui khuyên bạn tự nghiên cứu sẽ hiểu sâu và nhớ dai hơn, nó không có gì khó, tất cả các giải thích của bạn là rất gần đúng.
    Cấp phát 16 bytes cho biến con trỏ head. Lúc đầu địa chỉ con trỏ p được gán bằng địa chỉ con trỏ head rồi sau mỗi lần cin thì p tăng dần đến khi 16 bytes đều được ghi hết.
    p trỏ tới vị trí khác chứ không phải tăng. cấp phát kiểu này là giống như khai báo mãng, xài new thì phải dùng delete.
    Cách 3 tui sữa lại 1 tí, coi thử xem, và suy nghĩ 1 tí :
    PHP Code:
    #include <iostream>

    int main()
    {
      
    int *= new inti;
      for ( 
    i=i<i++ )
        
    cin >> *(p+i); 
      
      for(
    int x 04; ++x)
      {
        
    cout << (int*)(&p[x]) << '-';
      }
      
    delete p;

    Còn cách 2 là cách phi lý, không overflow mới là lạ
    Code:
    int *len, *p = new int;
            len = p+4;//Chỗ này là gì ?
            for (    ; p<len ; p++ )
                  cin >> *p;

  3. #3
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Các complier C++ sau này kiểu int đều 4 bytes.
    Nói chính xác hơn là các compiler 16-bit thì biến int đều là 2 byte ( = 16-bit).
    Các compiler 32-bit thì các biến int đều là 4 byte ( = 32 bit).
    Khi nào có compiler cho 64-bit thì chắc chắn các biến int sẽ là 8 byte.

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

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Còn cách 2 là cách phi lý, không overflow mới là lạ
    Code:
    int *len, *p = new int;
            len = p+4;//Chỗ này là gì ?
            for (    ; p<len ; p++ )
                  cin >> *p;
    thì mình cho cái con trỏ len trỏ vào vị trí cách p 16 bytes. Cái này tự mình ngồi lẩn thẩn nghĩ ra thôi nhưng mình chạy được mà có thấy bị sao đâu.

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

    Trích dẫn Nguyên bản được gửi bởi chocolate1 Xem bài viết
    thì mình cho cái con trỏ len trỏ vào vị trí cách p 16 bytes. Cái này tự mình ngồi lẩn thẩn nghĩ ra thôi nhưng mình chạy được mà có thấy bị sao đâu.
    chạy được là một chuyện , còn biết lợi dụng lỗi để khai thác lại là một chuyện khác
    None!

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

    Mặc định Cho mình hỏi cách khai báo mảng kiểu con trỏ

    vậy cái đoạn code đấy có lỗi gì hoặc chạy được nhưng có thể gây ra lỗi gì ?

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

    PHP Code:
    #include <iostream>

    int main()
    {
      
    int *len, *= new int;
          
    len p+4;//Cho^~ này là gì ?
          
    for (    ; p<len p++ )
            
    cin >> *p;
          
      for(
    int x 04; ++x)
        
    std::cout << p[x] << '-';
      
      
    delete[] p;
      return 
    0;

    vậy cái đoạn code đấy có lỗi gì hoặc chạy được nhưng có thể gây ra lỗi gì ?
    [main] Pointer 1000 (0) exception: trapped!
    [main] Pointer 1000 (0) exception: code 0xC0000005 at 0x6105AFAA
    [main] Pointer 1000 (0) exception: ax 0x5 bx 0xA0316AC cx 0x610626B0 dx 0x61064944
    [main] Pointer 1000 (0) exception: si 0x4 di 0xA0316A8 bp 0x246FE8C sp 0x246FE60
    [main] Pointer 1000 (0) exception: exception is: STATUS_ACCESS_VIOLATION
    [main] Pointer 1000 (0) stack: Stack trace:
    [main] Pointer 1000 (1) stack: frame 0: sp = 0x246FA50, pc = 0x6100A2C3
    [main] Pointer 1000 (0) stack: frame 1: sp = 0x246FA8C, pc = 0x7C9037BF
    [main] Pointer 1000 (0) stack: frame 2: sp = 0x246FAB0, pc = 0x7C90378B
    [main] Pointer 1000 (0) stack: frame 3: sp = 0x246FB60, pc = 0x7C90EAFA
    [main] Pointer 1000 (0) stack: frame 4: sp = 0x246FE8C, pc = 0x6101A4A7
    [main] Pointer 1000 (0) stack: frame 5: sp = 0x246FE9C, pc = 0x40D7D7
    [main] Pointer 1000 (0) stack: frame 6: sp = 0x246FF24, pc = 0x4010D7
    [main] Pointer 1000 (0) stack: frame 7: sp = 0x246FF40, pc = 0x61004402
    [main] Pointer 1000 (0) stack: frame 8: sp = 0x246FF88, pc = 0x61004420
    [main] Pointer 1000 (0) stack: frame 9: sp = 0x246FF94, pc = 0x41319E
    [main] Pointer 1000 (0) stack: frame 10: sp = 0x246FFA4, pc = 0x40103A
    [main] Pointer 1000 (0) stack: frame 11: sp = 0x246FFC0, pc = 0x7C816FD7
    [main] Pointer 1000 (0) stack: frame 12: sp = 0x246FFF0, pc = 0x0
    [main] Pointer 1000 (0) stack: End of stack trace

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

    ặc ! Tớ mới học, nhờ cậu nói rõ giùm !

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

    ặc ! Tớ mới học, nhờ cậu nói rõ giùm !
    Đọc lại cho kĩ, code ai viết vậy ta ? Không phải tui à nha, print ra mà debug đi, phải như vậy mới hiểu sâu dc !

Các đề tài tương tự

  1. Tệp tin *.lib khác *.dll khác nhau như thế nào ?
    Gửi bởi ngusaomanoi trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 18-12-2012, 05:15 PM
  2. Chính chủ cần bán CHCC 310 Minh Khai, bán chung cư 310 minh khai 87m tầng 8, cc 310 minh khai
    Gửi bởi nguyenminhanh trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 19-04-2012, 02:40 PM
  3. taị sao các biến static khi khai báo để dùng được lại phải khai báo lại trước hàm main ? ?
    Gửi bởi anhnpson trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 15-06-2011, 08:18 PM
  4. Lập trình C Thắc mắc về khai báo protoype và các hàm liên quan khi khai báo!
    Gửi bởi ganhim trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 15
    Bài viết cuối: 10-08-2010, 02:03 PM
  5. Sự khác nhau giữa các khai báo int, void, float trong khai báo hàm?
    Gửi bởi toend2008 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 06-05-2009, 07: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