01/10/2018, 13:57

Thắc mắc toán tử sizeof trong c++

Chào mọi người ,
Mình có một số vấn đề phát sinh với hàm sizeof này mong mọi người chỉ bảo giùm mình ?
Mình cấp phát một bộ nhớ động cụ thể chương trình dưới là q. vậy làm thế nào để mình tính được kích thước của bộ nhớ mình cấp phát ạ . khi mình dùng hàm sizeof thì nó chỉ trả về là 4byte . Nhưng mình muốn nó trả về là số byte của cả mảng của mình cụ thể code dưới là 100*4 = 400 thì làm thế nào ạ ?
Và từ vấn đề trên phát sinh thêm một cái nữa là mình tạo 1 mảng a[100] , và con trỏ p , khi mình kiểm tra kích thước bằng sizeof với a thì : 400 , nhưng với p lại là : 4 . vậy tại sao ạ ? và các khắc phục nếu có .
Mình xin trân thành cảm ơn.

Chương trình như sau:

#include <iostream>
#include <stdlib.h>
#include <graphics.h>
#include <conio.h>
using namespace std;


int main()
{
 float a[100];
 int lenght=0;
 float *p,*q;
 p=a;
 q=new float[100];
 cout<<"sizeof bang a="<<sizeof(a)<<endl;
 cout<<"sizeof bang p="<<sizeof(p)<<endl;
 cout<<a<<"//"<<p<<endl;    // dia chỉ như nhau
 cout<<"sizeof q mang dong="<<sizeof(q)<<endl;

}

Cảm ơn bạn Dark.Hades đã chia sẻ bài viết về địa chỉ và mảng rất hay . nhưng mình chưa tìm được cách khác phục hihi.

Và nếu anh em nào muốn kiểm tra việc cấp phát trong C++ có lỗi hay không thì mình biết Hai cách sau (trong sách : lập trình hướng đối tường . Gs.Pham Văn Ất)

Kiểu *p=new Kiểu[n];

Trước hết việc thì khi cấp phát bộ nhớ sẽ có 2 khả năng : thành công và không thành công ^^
Nếu thành công thì (Ví dụ là P ) sẽ chứa địa chỉ của vùng nhớ .
Chỗ này chú ý là cái địa chỉ chỏ về này khác với địa chỉ mảng khi anh em khai báo ;

ví dụ : 
int a[10]; con trỏ a lúc này là int[10] 
còn 
int *p=new int[10] ; là con trỏ kiểu int
Khi tao dùng toán tử gián
p=a;        thì sẽ bị đổi về kiểu *int nên không dùng sizeof được .

Cách 1:

double *pd;
int n;
cout<<"
 Số Phần tử:";
cin>>n;
pd= new double[n];
if (pd==NULL)
{
cout<<"Lỗi"<<endl;
exit(0);
}

Cách 2:
Sử dụng _new_handler (trong new.h)

void kiem_tra_new(void)
{
cout<<"Loi";
exit(0);
}
_new_handler=kiem_tra_new
int n;
cout<<"
So phan tu";
cin>>n;
pd=new double[n];

Sau một hồi đau não mình nghĩ không có cách nào khác phục sự phân dã của một mảng và dùng được sizeof sau phần dã đâu

stackoverflow.com
Sunil Hari

Find the Size of integer array received as an argument to a function in c

c, arrays
asked by Sunil Hari on 06:44AM - 05 Sep 14

Thanks again and good luck…
End.

Dark.Hades viết 16:00 ngày 01/10/2018
Learn C++ – 12 Jul 07

6.8 — Pointers and arrays

Pointers and arrays are intrinsically related in C++. Similarities between pointers and fixed arrays In lesson 6.1 — Arrays (part i), you learned how to define a fixed array: [crayon-5b7003bd…

Đọc phần sizeof bạn muốn

Lê Cường viết 15:59 ngày 01/10/2018

Cảm ơn bạn .và
Mình xin lỗi nhưng tiếng anh của mình kém hay … gì gì đó mờ mình tìm hoài không có đoạn khắc phục . bạn có thể chỉ mình cách khắc phục không?

Văn Dương viết 16:13 ngày 01/10/2018

Trong link không thấy đoạn chủ top cần thì phải.

unsigned char *array = function(x);

int arraylenght = ??
Dark.Hades viết 16:10 ngày 01/10/2018

Thớt nên linh động trong việc sử dụng mảng động và tĩnh.

Bạn dùng mảng động, tức là số phần tử chưa biêts tại thời điểm compile, tuy nhiên trong run time thì biết. Một con trỏ nó sẽ có dung lượng cụ thể trên mỗi hệ điều hành khác nhau.

Vì bản thân nó là con trỏ, nhiệm vụ của nó là trỏ tới một địa chỉ của một đối tượng, nó không cần phải giữ bất cứ thông tin nào khác, và cũng không có cách nào để moi thêm thông tin từ một con trỏ.

Với mảng tĩnh, ngay tại thời điểm compile, nó đã có kích thước luôn rồi, toán tử sizeof chỉ việc đọc cái size đã được nhét vào biến đó, mặc dù địa chỉ giống nhau nhưng không có nghĩa là chức năng giống nhau.

Vậy nên người ta mới đẻ ra các container như std::vector hay std::string,… Trong các container này đều có một biến std::size_t để lưu lại kích thước của mảng đó sau mỗi lần nó bị thay đổi.

Đã là cấp phát động thì chắc chắn bạn sẽ biết được kích thước mà mảng động đó giữ, việc cần làm là thả cái giá trị size đó vào một nơi mà bạn có thể quản lí tương tự các container của stl

Trần Hoàn viết 16:12 ngày 01/10/2018

Hoàn toàn không có cách nào biết được kích thước của mảng tạo ra bằng cách khởi tạo con trỏ, trừ khi bạn đã lưu giá trị này từ trước. Mình đã từng search Google về vấn đề này trước đây rồi

Nói chung dùng C++ thì dùng std::vector luôn, không cần phải dùng mảng

Bài liên quan
0