请问一下大家结构体命名加'*'和不加'*'的区别在哪里

请问一下大家结构体命名加'*'和不加'*'的区别在哪里

问题描述:

img

想问一下结构体这部分,加'*'就相当于是命名了一个结构体指针,所以按上图我开始是这么写的

typedef struct node
{
  int data[length];
  struct node*next;
}node;
typedef struct snode
{
  node *head,*rear;
}*linkstring;
//然后我在初始化的时候就这样子写
bool init_string(linkstring &s)
{
  s->head=s->rear=(node*)malloc(sizeof(node));
  s->rear->next=NULL;  
}

然后编译出来就会显示内存冲突,我把他改成像图中一样的普通的结构体类型,编译又可以通过了,所以想问一下这个是为什么呢?是因为指针不能这样子分配内存吗?

指针的内存分配需要靠new或者malloc才行。不管是一个变量指针还是一个结构体指针或是一个类指针都需要new或这malloc以分配内存。
如果你希望linkstring是一个指针,可通过类似以下方式实现

typedef struct snode
{
  node *head,*rear;
};

int main() {
  snode *linkstring;    //定义指针
  linkstring = (snode*)malloc(sizeof(snode));  //分配内存
  init_string(linkstring);    //最后再使用指针
}

加*就是结构体指针,可以用malloc分配空间

typedef struct snode
{
  node *head,*rear;
}*linkstring;
这样写的时候,linkstring是一个指针类型,linkstring s;这时候的s是没有分配内存空间的。这样使用前,程序猿必须手动给s分配内存。
而 
typedef struct snode
{
  node *head,*rear;
}linkstring;
这样写的时候,linkstring是一个非指针类型,linkstring s;这样用的时候,系统会自动给s分配内存(临时变量由系统自动分配内存),所以,这时候s是有内存空间的。