7

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

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

代码的输出是(在 32 位 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 ,我认为这是 sizeof char 而不是数据。test_int_ptr 也是如此。长话短说,我的问题是如何在指针或动态内存分配的数组中获取 sizeof 数据。

4

5 回答 5

15

如果您不自己维护信息,这不是您可以在 C 中做的事情。您创建了数组,因此您在某一时刻知道它们的大小,您只需要自己跟踪它。您可以创建一个数据结构来帮助您,或者只是仔细维护数组和大小信息,而不需要任何数据结构。

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

于 2009-10-15T07:22:22.623 回答
5

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

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

于 2009-10-15T07:22:23.950 回答
5

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

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

于 2009-10-15T07:22:49.167 回答
3

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

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

于 2009-10-15T07:22:37.873 回答
2

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

于 2009-10-15T07:25:40.183 回答