获取指针数据的大小

sys*_*ult 5 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++){
    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;
 }
Run Code Online (Sandbox Code Playgroud)

代码的输出是(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
Run Code Online (Sandbox Code Playgroud)

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

Car*_*rum 14

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

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


asv*_*kau 5

sizeof只知道在编译时静态知道的数组的完整大小.对于指针,它将返回内存地址的大小,即32位上的4位,64位上的8位.

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


sbi*_*sbi 5

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

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