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

Đề tài: Lý thuyết về mảng, chuỗi

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

    Mặc định Lý thuyết về mảng, chuỗi

    bạn nào am hiểu về c cho mình hỏi một nội dung như sau:
    Trong các sách lập trình và cả trên mạng đều nói ràng khi khai báo một mảng như int Arr[3] thì sẽ tạo ra 3 phần tử số nguyên là Arr[0], Arr[1], Arr[2]. Nhưng sao thầy dạy lập trình của mình lại bảo rằng tạo ra tới 4 phần tử tức Arr[0] tới Arr[3]. Thầy cho ví dụ: int Arr[2], gán Arr[0]=1, Arr[1]=2 Arr[2]=3, rồi lấy Arr[0]+Arr[1]+Arr[2] thì ra kết quà đúng bằng 6. Mình thử gán thêm Arr[3]=4 rồi cộng vào thì cũng ra được bằng 10. Mình thử cả với Arr[4], Arr[5], ... đều ra kết quả đúng. Vậy chỗ này là sao? mình không hiểu. Nếu như thế thì khai n phần tử đâu còn ý nghĩa gì nữa. Thầy mình bảo chỉ bảo đảm giá trị cho n+1 phần tử, cỏn các phần tử sau đó thì giá trị có thể thay đổi. Mong các bạn giúp mình với

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Thầy nào thế hử? Nói ra kể hơi buồn, nhưng mà như thế thì thầy hơi chuối đó.

    Dr có trích một đoạn trong cuốn: The ANSI C Programming Language, wrote by Ritchie and Kernighan:
    int ndigit[10];
    declares ndigit to be an array of 10 integers. Array subscripts always start at zero in C, so
    the elements are ndigit[0], ndigit[1], ..., ndigit[9]. This is reflected in the for
    loops that initialize and print the array.
    Như vậy là đã rõ vấn đề rồi, tuy nhiên ở một số compiler, họ lo sợ người dùng nhập thừa gây ra lỗi, nên họ thường tặng thêm một phần tử nữa cho mảng. Điển hình cho việc, hay bị nhập thừa đó là mảng char (string).
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

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

    Thầy mình bảo chỉ bảo đảm giá trị cho n+1 phần tử, cỏn các phần tử sau đó thì giá trị có thể thay đổi. Mong các bạn giúp mình với
    Thầy bạn nói vậy là sai rồi, bạn hỏi lại xem có lẽ thầy bạn nhầm chăng ?
    Bạn cứ thử khai báo thêm chục phần tử cũng chẳng sao, đơn giản là vì mãng của C++ không có boundary checking. Mình đã in ra sizeof array rõ ràng không có chuyện n + 1 phần tử được :
    PHP Code:
    #include <iostream>

    int main(){
      
      
    int A[2];
      
    cout << "Size of A " << sizeof(A) << endl;
      
    A[0] = 1;
      
    A[1] = 3;
      
    A[2] = 12;
      
    A[3] = 4;
      
    A[4] = 100;
      
    cout << "opps " << sizeof(&A[4]) << endl;
      
    cout << "Size of A " << sizeof(A) << endl;
      
    cout << "what =" << A[0] + A[1] + A[2] + A[3] + A[4] << endl;

    Thường thì nó sẽ crash hoặc không nếu mình làm cách này, vì thực chất vùng nhớ sau vị trí cuối sẽ bị overwriteten.
    Giả sử mãng khai báo A[2]
    [4 bytes] [4 bytes] [4 bytes] [ 3 không tồn tại ] [ 4 không tồn tại ]
    2 thằng 3 và 4.... do nó là vùng nhớ kế tiếp mãng nên nó cũng có 4 byte chứ thực ra nó không có, nếu mình gán tức là nếu chỗ đó có dữ liệu nào trước đó sẽ bị ghi đè lên.

  4. #4
    Ngày gia nhập
    07 2007
    Nơi ở
    TP HCM
    Bài viết
    6

    nói đúng ra thì việc khai báo là a[3] sẽ tạo ra 4 phần tử, có chỉ số từ 0 đến 3 (trên lý thuyết)
    nhưng có 1 điều thú vị là trong VC++6.0 (cái này mình mới test trên VC6.0 thôi, VC++2k5 chưa test) thì việc khai báo a[3] nó không phải tạo ra 4 phần tử đâu
    không tin bạn có thể test bằng cách gán vào vòng for như sau:
    int a[4];
    for(int i = 0; i <= 5; i++)
    {
    a[i]=i;
    }

    rồi test như sau:
    int s = 0;
    for(int j = 0; j <= 5; j++)
    {
    s +=a[j];
    }

    đây là do cân bằng giữa tốc độ và tối ưu bộ nhớ. việc này có thể gây nhập nhằn và khó hỉu trong trường hợp test nhưng nó cũng cho ta không còn thành kiến rằng khi khai báo a[4] thì luôn chỉ có vùng nhớ 4 phần tử được cấp phát. tuy nhiên không phải vì vậy mà dùng lung tung vì các vùng nhớ kia có thể là rác, cũng có thể là của cái khác, nếu ta dùng thì nguy cơ bị crash và hơn nữa, cái đó ta ko quản lý được.
    Đã được chỉnh sửa lần cuối bởi ALTERMIGHTY : 30-01-2008 lúc 02:38 PM.

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

    các bạn cho mình hỏi thêm chỗ này: mình dùng C-free 4.0, khi khai báo mảng int hay long rồi lấy kích thước của nó thì cho kết quả giống nhau. VD như int arr[2] và long arr[2] đều cho 8 bytes. Lỗi này của Cfree hay các trình biên dịch khác có như thế không

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

    Mặc định Lý thuyết về mảng, chuỗi

    Long và int đối với các complier sau này đều là 4 byte hết, nếu bạn đang học C++ thì mình nghĩ bạn nên tập xài Visual C++ luôn. Mình chưa bao h xài C-free nên mình chịu :
    PHP Code:
    #include <iostream>

    int main()
    {
        
    long _arr[1];
        
    int _arr1[1];
        
    std::cout << sizeof(_arr) << '\n';
        
    std::cout << sizeof(_arr1) << '\n';


    Complier ở trường mình, Visual 2005 đều cho ra int và long là 4 byte.

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

  1. Lý thuyết tìm kiếm - Tìm kiếm và so khớp chuỗi - Lập trình C
    Gửi bởi neverland87 trong diễn đàn Thủ thuật, Tutorials CTDL & Giải thuật
    Trả lời: 6
    Bài viết cuối: 12-06-2013, 06:14 PM
  2. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  3. [Lý Thuyết Đồ Thị]. đồ thị có trọng số
    Gửi bởi hoangedward trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 26-03-2010, 03:23 PM
  4. sư huynh nào có lí thuyết về chuỗi trong C,cho đệ xin với
    Gửi bởi vu.fiit trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 7
    Bài viết cuối: 10-08-2008, 01:12 AM
  5. [c]lý thuyết đồ thị
    Gửi bởi diepanh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 16-01-2007, 09:11 AM

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