【问题标题】:Dynamic Memory Allocation for Arrays in CC 中数组的动态内存分配
【发布时间】:2013-05-24 02:15:38
【问题描述】:

所以我尝试使用 malloc 在 C 中创建一个动态数组,但由于某种原因它没有成功。这是我的代码:

    int* test = (int*) malloc(20 * sizeof(int));
    printf("Size: %d\n", sizeof(test));

当我运行此代码时,控制台输出 8,尽管我相信它理想情况下应该输出 80,因为 int 的大小是 4,而我正在创建其中的 20 个。那么为什么这不起作用呢?谢谢你的帮助。 :)

【问题讨论】:

  • 记得检查 malloc 的返回值,查看文档...
  • 旁注:C语言编程时请不要强制转换malloc的返回值。

标签: c arrays memory dynamic malloc


【解决方案1】:

如果你尝试打印 sizeof (&test) 的值,你会得到 80 (20 * 4)。 &test 的类型为 int (*) [20]。

我希望它能澄清你的疑问。

【讨论】:

    【解决方案2】:

    这里sizeof 运算符为您提供存储int* 所需的字节数
    即它相当于sizeof(int*);
    根据编译器的不同,它可能会给你48

    在 C 中,其程序员的工作是跟踪动态分配的字节数。

    【讨论】:

      【解决方案3】:

      sizeof 运算符返回int* 的大小,它只是一个指针。在 C 中,当你使用malloc 动态分配内存时,对malloc 的调用会返回一个指向新分配的内存块(通常在堆上)的指针。指针本身只是一个内存地址(通常只占用在大多数现代系统上为 4 或 8 个字节)。您需要自己跟踪实际分配的字节数。

      C 语言只会跟踪静态分配的缓冲区(堆栈数组)的缓冲区大小,因为数组的大小在编译时可用。

      int test[100];
      printf("Sizeof %d\n", sizeof(test))
      

      这将打印一个等于 100 * sizeof(int) 的值(在大多数现代机器上通常为 400)

      【讨论】:

      • 感谢您的回复。那么如何获取动态数组的大小呢?
      • @Mr Cherno,您无法使用标准 ANSI-C 获得它。您必须使用单独的变量自己简单地跟踪它。 (你知道你分配的缓冲区大小等于20 * sizeof(int))。
      • @CharlesSalvia,一个迂腐的观点,动态分配内存的大小被跟踪,否则你必须在调用 free() stackoverflow.com/questions/1518711/… 时指定大小
      猜你喜欢
      • 2023-03-17
      • 2021-07-17
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多