获取指针数据的大小

我尝试了以下代码,以了解如何获取指针数据的大小:

#include  #include  #include  int main(){ char *test_char_ptr = "This is just a test"; int *test_int_ptr = (int *) malloc(16*sizeof(int)); for(int i = 0; i<16; i++){ test_int_ptr[i] = i; } printf("%s\n",test_char_ptr); printf("Test char 1: %d\n", (int)sizeof test_char_ptr ); printf("Test char 2:%d\n", (int)sizeof *test_char_ptr ); printf("Test char 3: %d\n", (int)((strlen(test_char_ptr)+1) * sizeof(char))); printf("Test int 1:%d\n", (int)sizeof test_int_ptr ); printf("Test int 2:%d\n", (int)sizeof *test_int_ptr ); return EXIT_SUCCESS; } 

代码的输出是(On 32 bit gcc 4.3):

 This is just a test Test char 1: 4 Test char 2:1 Test char 3: 20 Test int 1:4 Test int 2:4 

我认为sizeof(* test_char_ptr)会给我* test_char_ptr里面数据的大小。 但相反它给了我1,我认为这是char的大小而不是数据。 test_int_ptr也是如此。 长话短说,我的问题是如何在指针或动态内存分配数组中获取sizeof数据。

在没有自己维护信息的情况下,这不是你可以用C做的事情。 您创建了arrays,因此您只需要知道它们的大小,就必须自己跟踪它们。 您可以创建一个数据结构来帮助您,或者只是在没有任何数据结构的情况下仔细维护数组和大小信息。

此外,您的代码使用strlen()来获取字符串的大小 – 请确保您记住返回的大小不包括终止空字符( '\0' ); 字符串常量的内存大小是strlen(string) + 1

指针不跟踪在它指向的(第一个)后面分配的对象的数量。 那是因为它不能: malloc()只返回第一个元素的地址,没有别的。

因此,无法找出动态分配的数组的大小。 你必须自己跟踪它。

sizeof只知道数组的完整大小,如果在编译时静态知道的话。 对于指针,它将返回存储器地址的大小,即32位为4,64位为8。

当您使用指针时,由您来了解并跟踪它指向的数据的大小。 语言实现不会像对arrays那样为你做。

没有标准的方法可以做到这一点。 您必须将分配的内存长度保留在另一个变量中,或者使用一个跟踪您的“容器”。

某些平台确实具有查找分配中字节数的function,例如Symbian作为AllocSize(ptr)function。

指针仅指向数据开始的位置。 它对数据的大小一无所知。