将一个结构体的地址传入给一个函数,这个函数将此结构体的地址传给另一个函数,为什么跑不起来,原因尽然是……

1.test函数

void testInitList(SL* sl) {
	//SL sl;//在创建结构体对象的时候就把这个结构体的地址定下来了,要改变其内部,需传递地址
	SQLinitList(sl);//无敌之精华,写入csdn
}

void test_pushback() {
	SL sl;
	//SQLinitList(&sl);
	testInitList(&sl);
	SQLPushBack(&sl, 1);
	SQLPushBack(&sl, 2);
	SQLPushBack(&sl, 3);
	SQLPushBack(&sl, 4);
	SQLPushBack(&sl, 5);
	SQLPushBack(&sl, 6);
	SQLPushBack(&sl, 7);
	SQL_print(sl);
}

2.function函数

//1.初始化
void SQLinitList(SL* ps) {
	ps->a = NULL;
	ps->size = 0;
	ps->capacity = 0;
}
//2.头插尾插头删尾删
void SQLPushBack(SL* ps, SQDataType x) {
	if (ps->size == ps->capacity) {
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SQDataType* tmp = (SQDataType*)realloc(ps->a, newcapacity * 2 * sizeof(SQDataType));
		if (tmp == NULL) {
			printf("realloc is error\n");
			exit(-1);
		}
		else {
			ps->a = tmp;
			ps->capacity = newcapacity;
		}
	}

	ps->a[ps->size] = x;
	ps->size++;
}

3.头文件函数

typedef int SQDataType;
typedef struct SeqList {
	SQDataType* a;
	int size;
	int capacity;
}SL;

//1.初始化
void SQLinitList(SL* ps);
//2.头插尾插头删尾删
void SQLPushBack(SL* ps, SQDataType x);

这儿的test函数之间的

void testInitList(SL* sl) {

SQLinitList(sl);//无敌之精华,写入csdn
}

不能写成 SQLinitList(&sl);,因为这儿的sl已经是结构体对象的地址了,如果要在函数内将这个结构体的地址在传给其他地方,那么因该直接传sl,而不是&sl,因为&sl是地址的地址。

解决方法2:

跳过testInitList()函数,直接在test_pushback()函数中调用初始化函数完成初始化,

void test_pushback() {
	SL sl;
	SQLinitList(&sl);
	//testInitList(&sl);
	SQLPushBack(&sl, 1);
	SQLPushBack(&sl, 2);
	SQLPushBack(&sl, 3);
	SQLPushBack(&sl, 4);
	SQLPushBack(&sl, 5);
	SQLPushBack(&sl, 6);
	SQLPushBack(&sl, 7);
	SQL_print(sl);
}

你可能感兴趣的:(C语言模糊知识点,每日出错分析,c语言,开发语言,算法,考研,java)