user-0 提问: 线性表的顺序结构

回复:
user: user-1
content: 引用 6 楼 qq423399099 的回复:[quote=引用 5 楼 ri_aje 的回复:] [quote=引用 4 楼 qq423399099 的回复:] -858993460 == 0xcccccccc, debug模式下编译器对未初始化的变量赋的缺省值 说明了什么？说明你调用了InitList根本没有起到作用 楼主你调用InitList传的是一级指针，是无法改变指针的指向的 要改变指向只能传二级指针或者一级指针的引用 改为：  bool InitList(SqlList **L) { 	*L = (SqlList *)malloc(sizeof(SqlList)); 	if(L == NULL) 		return false; 	(*L)->length = 0; 	return true; }  int main(void) { 	SqlList *list; 	InitList(&list); 	printf("%p\n", &list); 	printf("***%d***\n", list->length); }  一级指针没有问题，因为楼主要修改的是对象。[/quote] 他要修改的是指针的指向，为他malloc,不是修改对象[/quote] 这就是仁者见仁的问题了，从外面的对象来看，里面的 malloc 是多余的，完全可以理解为函数是用来通过指针初始化对象的；从里面的 malloc 来看，参数应该是 *& 或 **，外面应该用指针。楼主自己不出来说清楚，谁也说不清一定是那种用法。

user: user-2
content: 传一级指针的意思是： 函数中的形参的指针和main函数中的实参的指针指向了同一块内存区域 所以你想通过形参的指针改变指向的内存区域里面的内容是可以的，但你想改变main函数中的实参的指针的指向是不行的 你将malloc出来的内存地址赋值给形参的指针，只是改变了形参的指针的指向，对main函数的实参的指针是没有影响的

user: user-0
content: 调试的时候发现确实是一级指针无法改变指针所以指向的，没看过二级指针，所以还是迷糊啊

user: user-0
content: 引用 7 楼 ri_aje 的回复:[quote=引用 6 楼 qq423399099 的回复:] [quote=引用 5 楼 ri_aje 的回复:] [quote=引用 4 楼 qq423399099 的回复:] -858993460 == 0xcccccccc, debug模式下编译器对未初始化的变量赋的缺省值 说明了什么？说明你调用了InitList根本没有起到作用 楼主你调用InitList传的是一级指针，是无法改变指针的指向的 要改变指向只能传二级指针或者一级指针的引用 改为：  bool InitList(SqlList **L) { 	*L = (SqlList *)malloc(sizeof(SqlList)); 	if(L == NULL) 		return false; 	(*L)->length = 0; 	return true; }  int main(void) { 	SqlList *list; 	InitList(&list); 	printf("%p\n", &list); 	printf("***%d***\n", list->length); }  一级指针没有问题，因为楼主要修改的是对象。[/quote] 他要修改的是指针的指向，为他malloc,不是修改对象[/quote] 这就是仁者见仁的问题了，从外面的对象来看，里面的 malloc 是多余的，完全可以理解为函数是用来通过指针初始化对象的；从里面的 malloc 来看，参数应该是 *& 或 **，外面应该用指针。楼主自己不出来说清楚，谁也说不清一定是那种用法。[/quote]  我明白你们的意思了   malloc分配了一个新的地址而我只是改变这个新的地址里面的数据，原来地址里面的数据没有改变 但是我还是迷糊，我不是把malloc分配的地址给list吗？

user: user-2
content: 引用 5 楼 ri_aje 的回复:[quote=引用 4 楼 qq423399099 的回复:] -858993460 == 0xcccccccc, debug模式下编译器对未初始化的变量赋的缺省值 说明了什么？说明你调用了InitList根本没有起到作用 楼主你调用InitList传的是一级指针，是无法改变指针的指向的 要改变指向只能传二级指针或者一级指针的引用 改为：  bool InitList(SqlList **L) { 	*L = (SqlList *)malloc(sizeof(SqlList)); 	if(L == NULL) 		return false; 	(*L)->length = 0; 	return true; }  int main(void) { 	SqlList *list; 	InitList(&list); 	printf("%p\n", &list); 	printf("***%d***\n", list->length); }  一级指针没有问题，因为楼主要修改的是对象。[/quote] 他要修改的是指针的指向，为他malloc,不是修改对象

user: user-0
content: 我自己单步运行 在bool InitList(SqlList* L)里面length确实等于0 但是一离开bool InitList(SqlList* L)，length就不是0了。想不通啊，我不是传了地址进去的吗？

user: user-1
content: 引用 4 楼 qq423399099 的回复:-858993460 == 0xcccccccc, debug模式下编译器对未初始化的变量赋的缺省值 说明了什么？说明你调用了InitList根本没有起到作用 楼主你调用InitList传的是一级指针，是无法改变指针的指向的 要改变指向只能传二级指针或者一级指针的引用 改为：  bool InitList(SqlList **L) { 	*L = (SqlList *)malloc(sizeof(SqlList)); 	if(L == NULL) 		return false; 	(*L)->length = 0; 	return true; }  int main(void) { 	SqlList *list; 	InitList(&list); 	printf("%p\n", &list); 	printf("***%d***\n", list->length); }  一级指针没有问题，因为楼主要修改的是对象。

user: user-0
content: 我是参照李春保的数据结构一书

user: user-2
content: -858993460 == 0xcccccccc, debug模式下编译器对未初始化的变量赋的缺省值 说明了什么？说明你调用了InitList根本没有起到作用 楼主你调用InitList传的是一级指针，是无法改变指针的指向的 要改变指向只能传二级指针或者一级指针的引用 改为：  bool InitList(SqlList **L) { 	*L = (SqlList *)malloc(sizeof(SqlList)); 	if(L == NULL) 		return false; 	(*L)->length = 0; 	return true; }  int main(void) { 	SqlList *list; 	InitList(&list); 	printf("%p\n", &list); 	printf("***%d***\n", list->length); }

user: user-1
content: 把那句 malloc 去掉再试一下，L 修改以后已经指向不同的对象了，后面的操作都影响不到调用端的 list 对象了。 另外，length 也拼错了，看来要么是楼主抄书钞错了，要么是书太烂了。