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

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++中,不同类型的结构体数组作为参数传递给函数时,可以通过指针或引用来实现。这是因为虽然直接传递不同类型的数组可能会导致类型不匹配错误,但你可以通过以下两种方式处理: 1. **使用void*指针**: 可以定义一个接受`void*`类型的函数,然后将结构体数组转换为指向`void`的指针传递进去。在函数内部,你需要进行强制类型转换来访问结构体的数据。 ```cpp struct TypeA { // ... }; struct TypeB { // ... }; void processStructArray(void* array, size_t length) { if (array && length > 0) { size_t i; for (i = 0; i < length; ++i) { TypeA* a = static_cast<TypeA*>(array); TypeB* b = static_cast<TypeB*>(array); // 这里假设TypeA和TypeB有相同的大小 // 对于每个元素,根据类型进行操作 if (a) { // 操作TypeA } else if (b) { // 操作TypeB } array += sizeof(TypeA); // 或sizeof(TypeB),取决于实际大小 } } } // 使用示例 TypeA arrA[5]; TypeB arrB[3]; processStructArray(arrA, sizeof(arrA)/sizeof(arrA[0])); // 注意这里是TypeA的实际大小 processStructArray(arrB, sizeof(arrB)/sizeof(arrB[0])); // 类似地处理TypeB ``` 2. **模板函数**: 如果结构体之间有一些共性的行为,可以使用模板函数,它可以接受各种类型符合特定结构的数组。 ```cpp template<typename T, typename SizeType> void processStructArray(T (&array)[SizeType], SizeType length) { for (size_t i = 0; i < length; ++i) { // 假设所有结构都有成员m std::cout << array[i].m << " "; } } // 示例 struct MyStruct { int m; }; processStructArray(MyStruct[], 10); // 接受MyStruct类型的数组 ``` 在这个例子中,`T`是模板类型,可以根据传入的具体类型自动调整函数的行为。 **相关问题**: 1. 如何避免直接传递不同类型的数组引发的编译错误? 2. C++模板函数是如何工作的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值