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

Đề tài: xin hỏi 1 chút về stack

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

    Mặc định xin hỏi 1 chút về stack

    C++ Code:
    1. cout<<sizeof("hello")<<endl;
    cho mình hỏi đoạn code trên thì "hello" nằm trong stack?
    nếu đúng thì cho mình hỏi tiếp
    C++ Code:
    1. int g =10;
    khi thực hiện phép gán cho g thì '10' ở đây có được allocate trong stack không?
    C++ Code:
    1. int arr[10];
    2. cout<<*arr<<endl;
    ở đây thì arr[10] được allocate 40 bytes kiểu int trong stack. vậy còn pointer arr thì sao?
    có phải là nó còn allocate them 4 byte cho con trỏ arr nữa?

    many thanks

  2. #2
    Ngày gia nhập
    04 2013
    Nơi ở
    $HOME
    Bài viết
    48

    Trích dẫn Nguyên bản được gửi bởi quano1 Xem bài viết
    C++ Code:
    1. cout<<sizeof("hello")<<endl;
    cho mình hỏi đoạn code trên thì "hello" nằm trong stack?
    Chuỗi "hello" không nằm trong stack. Những chuỗi kiểu như "hello" gọi là string literals, và các string literals này sẽ được để ở một vùng nhớ riêng. Vùng nhớ này thường là read-only, và nếu truy cập vào đó để thay đổi nội dung thì sẽ có lỗi runtime. Mình nhớ không nhầm thì trong C standard có nói rõ là sẽ có "undefined behavior". Do đó, không nên viết đoạn code
    C Code:
    1. char *p = "hello";
    2. p[0] = 'H';
    Một trong những lý do để mà string literals được đưa vào vùng nhớ riêng là để tiết kiệm bộ nhớ. Ví dụ bạn có thể có đoạn code:
    C Code:
    1. char *s = "hello";
    2. char a[] = "hello";
    3. printf("%lu", sizeof("hello"));
    Rất có thể sẽ chỉ có một string literal "hello" ở trong bộ nhớ (nhưng việc có 1 hay nhiều hơn 1 thì tùy thuộc vào trình biên dịch).

    Trích dẫn Nguyên bản được gửi bởi quano1 Xem bài viết
    nếu đúng thì cho mình hỏi tiếp
    C++ Code:
    1. int g =10;
    khi thực hiện phép gán cho g thì '10' ở đây có được allocate trong stack không?
    Chắc chắn g sẽ được cấp phát, nhưng nếu g được khai báo bên ngoài tất cả các hàm thì g sẽ được cấp phát trong phần .data (với Linux). Chú ý là nếu chỉ khai báo
    C Code:
    1. int g;
    như biến toàn cục, thì g sẽ được cấp phát ở phần .bss và sẽ được khởi tạo giá trị 0 (được đảm bảo bởi C standard).

    Ngược lại nếu đó là khai báo trong một hàm, thì g sẽ được cấp phát trên stack.

    Giá trị 10 sẽ không được cấp phát (trong cả trường hợp toàn cục và cục bộ), mà sẽ được chuyển thẳng vào trong mã máy được dịch ra (ít nhất là mã cho Intel vì nó cho phép "operand" của một lệnh có thể là một hằng).

    Trích dẫn Nguyên bản được gửi bởi quano1 Xem bài viết
    C++ Code:
    1. int arr[10];
    2. cout<<*arr<<endl;
    ở đây thì arr[10] được allocate 40 bytes kiểu int trong stack. vậy còn pointer arr thì sao?
    có phải là nó còn allocate them 4 byte cho con trỏ arr nữa?
    many thanks
    Như ở trên, tùy theo arr được khai báo là biến toàn cục hay cục bộ mà arr sẽ được cấp phát ở phần .data hay là trên stack. Lưu ý là bộ nhớ cấp phát cho arr là 10 * sizeof(int). Trong đa phần các trường hợp, sẽ là 40, nhưng không nhất thiết.

    Sẽ không có "pointer ar", không có bộ nhớ cấp phát cho "pointer arr". Trước hết là ví dụ đơn giản với đoạn lệnh
    C Code:
    1. int g = 10;
    2. printf("%d", g);
    Biến g được cấp phát một vùng bộ nhớ kích thước sizeof(int). Biến g thực chất là để thuận tiện cho việc gọi đến vùng nhớ được cấp phát cho g.

    Quay trở lại câu hỏi của bạn. Chỉ có một vùng nhớ được cấp phát cho arr, tương tự như chỉ có một vùng nhớ cấp phát cho biến g. Nhưng với câu lệnh cout << *arr << endl; trình biên dịch sẽ chuyển arr thành kiểu con trỏ int và mang giá trị là vùng nhớ được cấp phát cho arr. Do đó câu lệnh sẽ in ra giá trị arr[0].

    Không nên nhầm lẫn giữa con trỏ và mảng. Xem thêm ở đây: http://diendan.congdongcviet.com/showthread.php?p=630469#post630469

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

  1. Bài tập C++ copy noi dung tu stack S sang stack D
    Gửi bởi thaodn_chuprong trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 12
    Bài viết cuối: 18-10-2012, 11:45 PM
  2. Cấu trúc dữ liệu Chuyển các phần tử từ stack này sang stack kia như thế nào?
    Gửi bởi rukawa1184 trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 9
    Bài viết cuối: 06-12-2011, 06:52 PM
  3. Stack, ngăn xếp - Thiết lập và ứng dụng stack trong C
    Gửi bởi PoPoPoPo trong diễn đàn Thủ thuật, Tutorials CTDL & Giải thuật
    Trả lời: 8
    Bài viết cuối: 15-11-2010, 11:24 PM
  4. Stack trên C | Lỗi khó hiểu trong Stack
    Gửi bởi tom3cang trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 22-05-2009, 11:09 PM
  5. Code về stack | Chuyển hệ số 10 sang 2 dùng stack
    Gửi bởi ahappyboy89 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 17-04-2009, 09:48 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