C语言结构体指针使用时出现的错误(没有给结构体分配内存)

C语言 专栏收录该内容
3 篇文章 0 订阅

最近学习数据结构,用C语言的结构体编写顺序表时出现了问题:
这是源代码:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define bool char
#define true 1
#define false 0
#define MAXSIZE 6
struct SequenceList
{
    int* data;
    int length;
    int size;
};
//创建一个新表
bool creatList(struct SequenceList* ptr)
{

	if((ptr->data=(int*)malloc(MAXSIZE*sizeof(int)))==NULL)
	{
	    printf("申请内存失败");
		return false;
	}
    printf("成功");
    ptr->length = 0;
    ptr->size = MAXSIZE;
    return true;
}
//将表清除
bool clear(struct SequenceList* ptr)
{
    if(!ptr->data)
    {
        return false;
    }
    ptr->length = 0;
    return true;
}
//表的插入
bool insert(struct SequenceList* ptr,int position,int element)
{
    int i = 0;
    if (position<1 || position>ptr->length+1)
    {
        printf("输入位置不正确");
        return false;
    }
    if (ptr->length==ptr->size)
    {
        printf("顺序表已经满了");
        return false;
    }
    for(i=ptr->length-1; i>=position-1; i--)
    {
        ptr->data[i+1] = ptr->data[i];
    }
    ptr->data[position-1] = element;
    ptr->length++;
    return true;
}

void print(struct SequenceList* ptr)
{
    int i = 0;
    for(i = 0; i<ptr->length; i++)
    {
        printf("%d\t",ptr->data[i]);
    }
    printf("\n");
}
int main()
{
    struct SequenceList *ptr;
    creatList(ptr);
    int i=0;
    for(i=0; i<3; i++)
    {
        insert(ptr,i+1,i);
    }
    print(ptr);
    return 0;
}

主要看main方法吧,首先声明了一个结构体的指针,然后想通过按引用传递的
方式将结构体指针传入crteatList函数,在函数内部进行内存分配。但是程序出错了。
原因 就是 struct SequenceList *ptr这句话, 内存没有给这个结构体指针分配内存,

       struct SequenceList *ptr;
        printf("%p\n", *ptr);    

这样程序执行是没有结果的,由此可见没有得到内存空间
但是下面这样:

struct SequenceList *ptr;
    ptr = (struct SequenceList *)malloc(sizeof(struct SequenceList ));
    printf("%p\n", *ptr);      //12个字节,这是就是结构体该有的内存

这样就可以得到ptr所指向结构体的地址

  struct SequenceList List;
    printf("%p",List);

这种声明变量的方式也可以得到地址

所以:在使用结构体指针之前一定要进行内存分配!!

  • 0
    点赞
  • 0
    评论
  • 7
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

gzh_kevin

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值