Announcement

Collapse
No announcement yet.

Ngôn ngữ C: kích thước biến con trỏ

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ngôn ngữ C: kích thước biến con trỏ

    các bạn cho mình hỏi trong ngôn ngữ C, kích thước con trỏ là bao nhiêu?

  • #2
    In practice, pointers will be size 2 on a 16-bit system (if you can find one), 4 on a 32-bit system, and 8 on a 64-bit system [from stackoverflow]

    Comment


    • #3
      2 câu trả lời trên chính xác rồi, bổ sung thêm:
      Hệ điều hành 32bit -> 1 ô nhớ 32 bit (cỏn trỏ trỏ vào ô nhớ)

      Comment


      • #4
        Mình nghĩ là tùy vào trình biên dịch , chứ bản thân ngôn ngữ C nói riêng và ngôn ngữ nói chung chỉ là 1 tập các từ khóa và cú pháp tạo thành ngôn ngữ lập trình và một số hỗ trợ nhất định, vì thế chúng ko quy định trước kích thước ô nhớ. Con trỏ cũng là 1 ô nhớ , trình biên dịch muốn quy định nó là mấy byte thì tùy thôi.

        Comment


        • #5
          theo như mình tìm hiểu thì nó phụ thuộc vào kiến trúc CPU, OS, trình biên dịch, nhưng hình như quan trọng nhất là kiến trúc CPU thì lại không thấy ai nhắc đến.

          Comment


          • #6
            Theo mình biết thì sizeof(pointer) = sizeof(int) trên tất cả các system
            https://ledsieure.com - Tết rồi, mua đèn về trang trí đi

            Comment


            • #7
              Originally posted by CH1101146 View Post
              Theo mình biết thì sizeof(pointer) = sizeof(int) trên tất cả các system
              Code:
              $ cat test.c
              #include <stdio.h>
              
              int main(){
                  printf("sizeof(int*) = %d\nsizeof(int) = %d\n", sizeof(int*), sizeof(int));
                  
              }
              $ gcc test.c -o test
              test.c: In function ‘main’:
              test.c:4:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat]
              test.c:4:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘long unsigned int’ [-Wformat]
              $ ./test
              [B][SIZE=5]sizeof(int*) = 8
              sizeof(int) = 4[/SIZE][/B]
              $ uname -a
              Linux localhost 3.8.13-gentoo #1 SMP Sat May 18 20:30:06 ICT 2013 x86_64 Intel(R) Core(TM) i5-3550 CPU @ 3.30GHz GenuineIntel GNU/Linux
              $ gcc -v
              Using built-in specs.
              COLLECT_GCC=/usr/x86_64-pc-linux-gnu/gcc-bin/4.6.3/gcc
              COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/4.6.3/lto-wrapper
              Target: x86_64-pc-linux-gnu
              Configured with: /var/tmp/portage/sys-devel/gcc-4.6.3/work/gcc-4.6.3/configure --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/4.6.3 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.6.3 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.6.3/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.6.3/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include/g++-v4 --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --disable-altivec --disable-fixed-point --without-cloog --without-ppl --disable-lto --enable-nls --without-included-gettext --with-system-zlib --enable-obsolete --disable-werror --enable-secureplt --enable-multilib --enable-libmudflap --disable-libssp --enable-libgomp --with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/4.6.3/python --enable-checking=release --disable-libgcj --enable-libstdcxx-time --enable-languages=c,c++,fortran --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-targets=all --with-bugurl=http://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.6.3 p1.13, pie-0.5.2'
              Thread model: posix
              gcc version 4.6.3 (Gentoo 4.6.3 p1.13, pie-0.5.2) 
              $
              Chắc bạn chưa biết về system của mình. Câu trả lời ở #2 là đúng rồi.

              Comment


              • #8
                Kích thước của con trỏ phụ thuộc vào người thiết kế trình biên dịch C chứ không phải do quy định của ngôn ngữ C...

                đây là một ví dụ, một con trỏ có kích thước là 3 bytes



                KeilC là một trình biên dịch cho Vi điều khiển cụ thể là 8051 ... cho nên tổ chức bộ nhớ của nó có một chút khác biệt so với các hệ thống mà các bạn ví dụ ở trên

                Theo mình nghĩ, người ta sẽ cố gắng chọn kích thước con trỏ sao cho tối ưu về mặt truy xuất bộ nhớ nhất... và kích thước con trỏ bằng với kích thước thanh ghi của hệ thống đích, có lẽ là tối ưu nhất :shy:
                Last edited by 08520229; 19-06-2013, 16:18.
                Một khẩu súng giữ hai trời Nam Bắc,
                Một dấu chân in màu đất hai miền.

                ------------------------------------------------------

                Comment

                LHQC

                Collapse
                Working...
                X