2 yutiro yutiro 于 2014.10.04 14:52 提问

c语言数组指针,不报错,就停止工作,请问哪里错了

第一次提问,多包含,也不报错,为什么一运行就按停止工作报错
#include
#include
#include

struct arr
{
int *pbase;//第一个元素的首地址
int len;//数组所能容纳的最大元素个数
int cnt;//当前数组有效元素个数
};

void init_arr(struct arr *p1,int length)
{
(p1->pbase) = (int *)malloc(sizeof(int) * length);//给数组分配空间

if(NULL == (p1->pbase))
{
    printf("分配内存失败!");
    exit(-1);
}
else
{
    p1->len = length;
    p1->cnt = 0;
}
return;

}

bool is_empty(struct arr *p3)
{
if(0 == (p3->cnt))
return true;
else
return false;
}

void show_arr(struct arr *p2)
{
if(is_empty(p2))
{
printf("用户数据为空!");
}
else
{
for(int i=0; i<(p2->cnt); i++)
{
printf("%d ", *((p2->pbase)+i));
}
printf("\n");
}
}

main()
{
struct arr *p;
int j;//数组最大长度

printf("请输入定义的数组的最大长度:");
scanf("%d", &j);
init_arr(p,j);
//init_arr(p,5);
show_arr(p);

}

2个回答

BillyThe
BillyThe   2014.10.04 22:14

嗨!
你可以看下struct arr *p;这个语句;
p被声明为一个指向struct arr的指针,在32位系统下占用4bytes,默认情况下被初始化为NULL或是无效值;在接下来的init_arr()中,第一个参数要求的应该是一个struct arr实体地址,如果把p传入进去,很可能导致一个非法或无效访问;

在init_arr()方法中并没有对p的合法性进行检查(是否为NULL),所以问题就出在这里。

解决办法:1.将main函数中p变量声明为struct arr p, 然后在你init_arr()中传参为(struct arr *)&p;
2.此外,要在init_arr()函数中添加第一个参数空指针的检查

希望能帮到你

gan681
gan681   2014.10.06 13:57

在数据结构这本书中有类似的结构体调用,创建顺序链表的例子,其中关于这一语句

void init_arr(struct arr *p1,int length)此处似乎应改为void init_arr(struct arr &p1,int length)

不应使用*p1,这样*p1为指向该结构体指针,而是用&p1则为结构体p1的地址,然后调用时应该这样调用init_arr(p1,length),调用时只用p1,因为p1本来就是结构体地址,我们常常通过p1->len来使用数据。
例如
struct data{
int i;
int j;
}p1;

如果有
data *p;

*p=p1;
那么想通过p访问p1中的i就应该
(*p)->i;

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!