user-0 提问: C为什么我的输出函数没有运行呢？

回复:
user: user-0
content: 引用 6 楼 tjw316248269的回复:[quote=引用 5 楼 m0_46472878 的回复:] [quote=引用 3 楼 tjw316248269的回复:][quote=引用 2 楼 m0_46472878 的回复:] [quote=引用 1 楼 tjw316248269的回复:]怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬[/quote]   你不是要以指针形式保存么，声明一次，把附加的附到后面不就好了。 先假设你写的程序别的问题没有，单纯说在函数体malloc的，生命周期也只有那个函数存活周期。所以你认为你把这个东西给了L，然后就可以调用函数show打印了。但是结果是没有的。 因为传到show的还是你第一次在main声明的那个，你在连接node的函数中连接的那部分内存，被泄露了。也就是并没有附加到L。所以L->next是空的，当然也就打印不出来了。 当然你的程序问题太多了，比如说释放指针要free啊，然后你这个在main中声明的指针也没有初始化，这是野指针。。 如果你想要在函数体malloc然后再传到外面，你可以声明为static，这样存活周期就和整个程序存活周期一样了。 [/quote] 大佬 那个memset函数  那个加了和没加的结果是一样的吗，那个具体是干什么的 不太明白，我没加那个然后也是正常输出了  [/quote]  我写那个就是把内存清零的，初始化嘛，要养成好习惯啊[/quote] 还有那个输入函数，为啥是两次输入呢，没怎么明白 😂  能告诉下吗

user: user-1
content: 引用 5 楼 m0_46472878 的回复:[quote=引用 3 楼 tjw316248269的回复:][quote=引用 2 楼 m0_46472878 的回复:] [quote=引用 1 楼 tjw316248269的回复:]怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬[/quote]   你不是要以指针形式保存么，声明一次，把附加的附到后面不就好了。 先假设你写的程序别的问题没有，单纯说在函数体malloc的，生命周期也只有那个函数存活周期。所以你认为你把这个东西给了L，然后就可以调用函数show打印了。但是结果是没有的。 因为传到show的还是你第一次在main声明的那个，你在连接node的函数中连接的那部分内存，被泄露了。也就是并没有附加到L。所以L->next是空的，当然也就打印不出来了。 当然你的程序问题太多了，比如说释放指针要free啊，然后你这个在main中声明的指针也没有初始化，这是野指针。。 如果你想要在函数体malloc然后再传到外面，你可以声明为static，这样存活周期就和整个程序存活周期一样了。 [/quote] 大佬 那个memset函数  那个加了和没加的结果是一样的吗，那个具体是干什么的 不太明白，我没加那个然后也是正常输出了  [/quote]  我写那个就是把内存清零的，初始化嘛，要养成好习惯啊

user: user-0
content: 引用 3 楼 tjw316248269的回复:[quote=引用 2 楼 m0_46472878 的回复:] [quote=引用 1 楼 tjw316248269的回复:]怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬[/quote]   你不是要以指针形式保存么，声明一次，把附加的附到后面不就好了。 先假设你写的程序别的问题没有，单纯说在函数体malloc的，生命周期也只有那个函数存活周期。所以你认为你把这个东西给了L，然后就可以调用函数show打印了。但是结果是没有的。 因为传到show的还是你第一次在main声明的那个，你在连接node的函数中连接的那部分内存，被泄露了。也就是并没有附加到L。所以L->next是空的，当然也就打印不出来了。 当然你的程序问题太多了，比如说释放指针要free啊，然后你这个在main中声明的指针也没有初始化，这是野指针。。 如果你想要在函数体malloc然后再传到外面，你可以声明为static，这样存活周期就和整个程序存活周期一样了。 [/quote] 大佬 那个memset函数  那个加了和没加的结果是一样的吗，那个具体是干什么的 不太明白，我没加那个然后也是正常输出了

user: user-0
content: 引用 3 楼 tjw316248269的回复:[quote=引用 2 楼 m0_46472878 的回复:] [quote=引用 1 楼 tjw316248269的回复:]怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬[/quote]   你不是要以指针形式保存么，声明一次，把附加的附到后面不就好了。 先假设你写的程序别的问题没有，单纯说在函数体malloc的，生命周期也只有那个函数存活周期。所以你认为你把这个东西给了L，然后就可以调用函数show打印了。但是结果是没有的。 因为传到show的还是你第一次在main声明的那个，你在连接node的函数中连接的那部分内存，被泄露了。也就是并没有附加到L。所以L->next是空的，当然也就打印不出来了。 当然你的程序问题太多了，比如说释放指针要free啊，然后你这个在main中声明的指针也没有初始化，这是野指针。。 如果你想要在函数体malloc然后再传到外面，你可以声明为static，这样存活周期就和整个程序存活周期一样了。 [/quote] 感谢大佬！ 真是以前没学 现在啥都不懂啊，谢谢这么用心的帮我都打出来了，非常感谢！！！ 太感谢了   好人一生平安 谢大佬  有不懂得 我还会继续在下面问的 您有空就帮我解答一下子 哈哈 谢谢了

user: user-1
content: 引用 2 楼 m0_46472878 的回复:[quote=引用 1 楼 tjw316248269的回复:]怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬[/quote]   你不是要以指针形式保存么，声明一次，把附加的附到后面不就好了。 先假设你写的程序别的问题没有，单纯说在函数体malloc的，生命周期也只有那个函数存活周期。所以你认为你把这个东西给了L，然后就可以调用函数show打印了。但是结果是没有的。 因为传到show的还是你第一次在main声明的那个，你在连接node的函数中连接的那部分内存，被泄露了。也就是并没有附加到L。所以L->next是空的，当然也就打印不出来了。 当然你的程序问题太多了，比如说释放指针要free啊，然后你这个在main中声明的指针也没有初始化，这是野指针。。 如果你想要在函数体malloc然后再传到外面，你可以声明为static，这样存活周期就和整个程序存活周期一样了。

user: user-0
content: 引用 1 楼 tjw316248269的回复:怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬

user: user-1
content: 怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }