user-0 提问: 额……链表读文件的过程中我DEBUG发现地址总是有偏移（不对）

回复:
user: user-1
content: 引用 5 楼 Lamuna 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] 每次都返回头指针，注意改一下函数的类型  改函数类型？返回头指针……是这个意思么？  NODE *file_append(NODE **node,int num){     /*............*/     return (*node); }  这样改么？请问这样改的意义是什么？  …………………… 迭代么？[/quote] 不是这样，当然这样做也是可以，类似strcpy一样；可以通过返回值也可以通过传入传出参数实现返回。 这是两种方式来获取链表的头节点：一种是传二重指针进去，第二种就是传一重指针，但是返回值返回头节点地址；当然，还有第三种，就是两个都做，不过没必要。

user: user-0
content: 另外，这个程序内存也是个问题 我生成了一个5.39M的文件，我分别在main的读取前，读取后和内存清理前设置了getchar()来观察内存变化：  int main(int argc,char *argv[]) {  	if (argc < 2) { 		printf("请指明文件名\n"); 		getchar(); 		return 1; 	}  	printf("开始读取文件……"); 	getchar();  	NODE *head = create_empty();  	clock_t start, end;  	start = clock(); 	if(!file_input(head, argv[1])){ 		printf("文件不存在！\n"); 		getchar(); 		return 2; 	} 	end = clock();  	printf("文件加载完毕！共耗时%d毫秒。\n",end - start); 	/*print_chaintab(head);*/  	getchar();  	remove_all_nodes(head); 	free(head);  	printf("记录清除完毕……"); 	getchar();  	return 0; }  运行时只占用572K   读取完所有记录居然有将近54M的占用   我清除链表的部分是这样写的：   /*删除指定节点*/ int delete_node(NODE *node) { 	if (!node) { 		return 0; 	} 	memset(node, 0, sizeof(node)); 	free(node); 	return 1; }  /*清空链表所有节点*/ int remove_all_nodes(NODE *HEAD) { 	if (!HEAD) { 		return 0; 	} 	NODE *cur = HEAD; 	NODE *temp = NULL; 	while (cur) { 		temp = cur->next; 		cur->next = cur->next->next; 		delete_node(temp); 		cur = cur->next; 	} 	return 1; }   按说这部分内存应该释放了才对？……可事实是内存占用依旧是这么多……   请问 1、为什么内存占用了50多M？这相当于是文件大小的10倍多了 2、到底我的清除链表有没有完成任务？这些内存是否已经被清除掉了？ 3、为什么清除后的程序没有恢复到500多K？如何让它恢复成初始大小？

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:每次都返回头指针，注意改一下函数的类型  改函数类型？返回头指针……是这个意思么？  NODE *file_append(NODE **node,int num){     /*............*/     return (*node); }  这样改么？请问这样改的意义是什么？  …………………… 迭代么？

user: user-0
content: strcpy....  char *strcpy(char *dest, const char *src) { 	char *tmp = dest;  	while ((*dest++ = *src++) != '\0') 		; 	return tmp; }  额……返回一个char *，同时*dest在操作的时候也被修改了……这个意思？

user: user-1
content: 引用 3 楼 Lamuna 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] void file_append(NODE **node,int num) {     if (!*node) {         return;     }     printf("\nbefore_node addr:0x%p\n",*node);     NODE *temp = create_empty();     temp->num = num;     (*node)->next = temp;     /*这样应该保证每次node都是最后一个节点?*/     (*node) = temp;     printf("\n temp addr:0x%p\n node addr:0x%p\n", *node); } //...         file_append(&tail, temp);  额……也就是说……如果……我想将一个指针作为函数的参数，在函数执行后应用参数的变化，就在实现函数时声明一个指向该指针的指针而不是获取该指针的地址么？ [/quote] 每次都返回头指针，注意改一下函数的类型

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:void file_append(NODE **node,int num) {     if (!*node) {         return;     }     printf("\nbefore_node addr:0x%p\n",*node);     NODE *temp = create_empty();     temp->num = num;     (*node)->next = temp;     /*这样应该保证每次node都是最后一个节点?*/     (*node) = temp;     printf("\n temp addr:0x%p\n node addr:0x%p\n", *node); } //...         file_append(&tail, temp);  额……也就是说……如果……我想将一个指针作为函数的参数，在函数执行后应用参数的变化，就在实现函数时声明一个指向该指针的指针而不是获取该指针的地址么？

user: user-2
content: void file_append(NODE **node,int num) {     if (!*node) {         return;     }     printf("\nbefore_node addr:0x%p\n",*node);     NODE *temp = create_empty();     temp->num = num;     (*node)->next = temp;     /*这样应该保证每次node都是最后一个节点?*/     (*node) = temp;     printf("\n temp addr:0x%p\n node addr:0x%p\n", *node); } //...         file_append(&tail, temp);

user: user-2
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素