【问题标题】:Right syntax with malloc : sizeof(*int) or sizeof(int*)malloc 的正确语法:sizeof(*int) 或 sizeof(int*)
【发布时间】:2017-04-05 07:14:32
【问题描述】:

我经常看到 malloc 分配的语法:

int **p = malloc(N*sizeof(int*))

p 是一个指针。我还看到了以下语法(可能我的来源不对):

int **p = malloc(N*sizeof(*int))

上述两种语法的区别在于,“star”* 出现在第一个类型 int 之后,第二个出现在之前。

您能告诉我上述两者之间的正确语法吗?

【问题讨论】:

  • 不应该是int *p = malloc(N*sizeof(int))还是int **p = malloc(N*sizeof(int*))
  • 是的,int **p = malloc(N*sizeof(int*)) 我在编辑中修复了它
  • 不要在互联网上发布这个问题,你为什么不在你的编译器中尝试它们,它会告诉你。另外,如果您阅读并理解了一本 C 编程书籍,您应该能够发现 *int 是无稽之谈。

标签: c syntax malloc


【解决方案1】:

第二个只能与 表达式 一起用作sizeof 运算符的操作数(并且*int 不是表达式,它是语法错误)。 您可能已经在使用规范方式分配任意类型的 N 个成员的动态数组的代码中看到它:

p = malloc (N * sizeof *p);

我故意不显示指针类型p 的声明,因为它不是必需的。即使p 的类型发生变化,您也永远不需要触碰这条分配线。它总是做正确的事。

C 语法sizeof 怪癖:带有表达式操作数,括号是可选的。当操作数是类型时,它们是必需的。

【讨论】:

    【解决方案2】:

    以上都不适用于足够的内存。下面是正确的:

    int *p = malloc(N * sizeof(int));
    

    int **p = malloc(N * sizeof(int *));
    

    在第一个中,您为整数分配内存并将其作为指针返回。第二个是分配指针数组,因此您需要在 sizeof 关键字中使用 * 字符。

    但是为了弄乱未来的尺寸,如果你将int *p 更改为char *p,最好使用以下语法:

    int *p = malloc(N * sizeof(*p));
    

    【讨论】:

      【解决方案3】:

      TL;DR第一个,partially(考虑到您的实际代码中有终止 ;)。

      可能会更好正确的写法应该是

       int *p = malloc(N*sizeof(*p));  // need memory for "int" type, not pointer to int
      

      这消除了对数据类型的硬编码依赖性。


      FWIW,第二个,

       int *p = malloc(N*sizeof(*int))
      

      是一个错误的陈述,语法错误。

      而且,对于nitpick来说,它不是“星号”,它被称为解引用运算符。

      【讨论】:

      • 这个int *p = malloc(N*sizeof(*int))应该是这个:int *p = malloc(N*sizeof(int))
      • @tilz0R 还有我在哪里提到的? :)
      • 如果你大声朗读sizeof *p,你说的是“sizeof star p”还是“sizeof dereferenced p”?
      猜你喜欢
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2021-05-18
      • 2021-11-22
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多