-3

在下面的结构指针示例中

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

   struct siva {
   int a;
   };

   typedef struct siva *s1;

    void main()
   {
    s1 b=(s1)malloc(sizeof(s1*));
    b->a=8;
    printf("\n The vlue is s1->a is %d",b->a);
    free(b);
  }

在上面的代码中,变量 b 没有被声明,但是这段代码是如何工作的

在这一行

   s1 b=(s1)malloc(sizeof(s1*));

如何为 b 分配内存以及为什么在 sizeof() 中使用 s1*。s1和s1有什么区别

4

3 回答 3

2

以下是s1's 类型的声明,作为指向 struct siva

typedef struct siva *s1;

以下是指向的指针s1(例如指向指针的指针struct siva

s1*

malloc中给出的大小是错误的,应该是

s1 b=(s1)malloc(sizeof(struct siva));

作为s1指向struct siva。它之所以起作用,只是因为结构中第一个元素的地址是结构的地址,但这基本上是一件危险的事情。

b被声明,在同一行中它被分配给:

    s1 b=(s1)malloc(sizeof(s1*));
//  ^^^^

请注意,在 C 语言中,您不允许从函数的返回值初始化变量。

于 2012-05-09T07:11:36.577 回答
1

s1 和 s1* 有什么区别

  • sizeof(s1)产生 的大小s1,即指向 的指针的大小siva
  • sizeof(s1*)产生指向 的指针s1大小,即指向 的指针的大小siva

最后,一行:

s1 b=(s1)malloc(sizeof(s1*));

应该读:

s1 b=(s1)malloc(sizeof(struct siva));
于 2012-05-09T07:11:20.387 回答
0

这段代码不起作用,至少不像作者想要的那样。 sizeof (s1*)给出指向 的指针s1的大小,即指向指向 的指针的大小struct siva

首先,我建议将该行更改为阅读

s1 b = malloc(sizeof *b);

首先,自 C89 以来,演员表是不必要的,实际上可能会导致问题。除非您使用的是非常旧的(C89 之前的)编译器,否则不要强制转换mallocor的结果calloc

其次,我使用表达式*b作为 sizeof 的操作数,而不是使用类型。它更简洁一些,您不必记住在声明bmalloc调用之间保持类型直接。由于 is 的类型bs1的同义词,因此 is的struct siva *类型。 *bstruct siva

调用的一般形式malloc应该是

T *p = malloc(sizeof *p * number_of_elements);

或者

T *p;
...  // some bit of code
p = malloc(sizeof *p * number_of_elements);

如果您正在分配 的单个实例T,您显然可以* number_of_elements从调用中删除malloc.

最后,一点建议 - 不要将指针隐藏在 typedef 后面。 s1根本不表示指针性,所以它b 应该malloc调用的目标并不是很明显。

于 2012-05-09T11:31:54.990 回答