C 获取指针数据的大小

C 获取指针数据的大小,c,pointers,memory-management,sizeof,C,Pointers,Memory Management,Sizeof,为了了解如何获取指针数据的大小,我尝试了以下代码: #include <stdio.h> #include <stdlib.h> #include <string.h> 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++

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

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

 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;
 }

我以为sizeof(*test_char_ptr)会给出*test_char_ptr中数据的大小。但是它给了我1,我认为这是char的大小,而不是数据。这同样适用于test_int_ptr。长话短说,我的问题是如何获得指针或动态内存分配数组中数据的大小。

在C语言中,如果不自己维护信息,就无法做到这一点。你创建了阵列,所以你知道它们的大小,你只需要自己跟踪它。您可以创建一个数据结构来帮助您,或者只是小心地维护数组和大小信息,而不需要任何数据结构


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

sizeof
只有在编译时静态已知的情况下才知道数组的完整大小。对于指针,它将返回内存地址的大小,即32位为4,64位为8


当您使用指针时,您需要知道并跟踪指针指向的数据的大小。语言实现不会像对数组那样为您实现这一点。

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


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

指针不跟踪分配在其指向的(第一个)对象后面的对象数。这是因为它不能:
malloc()
只返回第一个元素的地址,其他什么都不返回


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

指针只指向数据开始的位置。它不知道数据的大小。

你应该能够编辑你的帖子并清理它;如果发生这种情况,我会适当地修改我的答案。不需要他分配内存。有一些函数返回分配的内存,其他子系统释放/修改它。CreateDIBSection就是一个例子。@predrapanojlovic-什么是
CreateDIBSection
,它与这个问题有什么关系?@CarlNorum它是一个为您分配缓冲区的系统函数(此时您知道缓冲区的大小)。它属于最终将修改或释放缓冲区大小的子系统。因此,在这种情况下,您无法知道缓冲区的大小,您可能需要有一种方法来确定大小或验证缓冲区指针。这只是对“你创建了阵列,所以你知道它们的大小”的回应:)我相信你误解了我的说法,或者我没有说清楚。sizeof(*p)可能是1,但sizeof(p)与sizeof(void*)@asveikau相同:我现在可以看出我误解了你。抱歉。由于您的编辑更改了strlen()行,我认为输出不再匹配。好的,我更新了输出。可能是重复的
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