user-0 提问: glib的链表崩溃

回复:
user: user-0
content: 引用 8 楼 mymtom 的回复:[quote=引用 4 楼 caddor9100 的回复:] #include <glib.h> #include<glib/glist.h>  int main() {  	GSList* pList; 	const gint nSize = 10; 	int nx; 	gint array[nSize] ;   	gint nPos = 0; 	for(nPos = 0; nPos < nSize; nPos++) 	{ 		array[nPos] = nPos+1; 		g_list_append(pList, &array[nPos]); 	} 	GSList *st; 	g_print("begin\n"); 	for (nPos = 0; nPos < nSize; nPos++) 	{ 		st = g_slist_nth(pList, nPos); 		g_printf("%d,", *(gint*)(st->data)); 	}	 	g_slist_free(pList); 	g_print("begin\n");  	return 0; }    c 语言。 gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)   崩溃 看漏了，应该有两个问题 1.  第17行 g_list_append(pList, &array[nPos]); ===> g_slist_append(pList, &array[nPos]);   2. 第7行 GSList* pList; ===> GSList* pList = NULL;[/quote]    多谢，解决了  顺便请教一个 技巧问题：  samba共享给windows   用vs 当编辑器，写代码， windows linux换行不一致。 导致 后果就是 别人用vi打开后，会出现  M^。    我如何破？ 我是用samba。  有人会说：vs把每个文件另存为，之类的一些答案。 似乎不好。  1. vs 写代码，不可能写hello world， 会有很多文件。 我不可能每个文件高级另存为。 这样累而且会忘记。  2.  我是在找不到方法来解决了。  3. 让我换编辑器不现实， 我一直习惯Vs， 所以把vs当编辑器，也是首先。  辛苦大神了

user: user-1
content: 引用 4 楼 caddor9100 的回复:#include <glib.h> #include<glib/glist.h>  int main() {  	GSList* pList; 	const gint nSize = 10; 	int nx; 	gint array[nSize] ;   	gint nPos = 0; 	for(nPos = 0; nPos < nSize; nPos++) 	{ 		array[nPos] = nPos+1; 		g_list_append(pList, &array[nPos]); 	} 	GSList *st; 	g_print("begin\n"); 	for (nPos = 0; nPos < nSize; nPos++) 	{ 		st = g_slist_nth(pList, nPos); 		g_printf("%d,", *(gint*)(st->data)); 	}	 	g_slist_free(pList); 	g_print("begin\n");  	return 0; }    c 语言。 gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)   崩溃 看漏了，应该有两个问题 1.  第17行 g_list_append(pList, &array[nPos]); ===> g_slist_append(pList, &array[nPos]);   2. 第7行 GSList* pList; ===> GSList* pList = NULL;

user: user-0
content: 引用 6 楼 mymtom 的回复:[quote=引用 4 楼 caddor9100 的回复:] #include <glib.h> #include<glib/glist.h>  int main() {  	GSList* pList; 	const gint nSize = 10; 	int nx; 	gint array[nSize] ;   	gint nPos = 0; 	for(nPos = 0; nPos < nSize; nPos++) 	{ 		array[nPos] = nPos+1; 		g_list_append(pList, &array[nPos]); 	} 	GSList *st; 	g_print("begin\n"); 	for (nPos = 0; nPos < nSize; nPos++) 	{ 		st = g_slist_nth(pList, nPos); 		g_printf("%d,", *(gint*)(st->data)); 	}	 	g_slist_free(pList); 	g_print("begin\n");  	return 0; }    c 语言。 gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)   崩溃 17行 g_list_append(pList, &array[nPos]); ===> g_slist_append(pList, &array[nPos]);[/quote]   int main() {  	GSList* pList; 	const gint nSize = 10; 	gint array[nSize] ;  	gint nPos = 0; 	for(nPos = 0; nPos < nSize; nPos++) 	{ 		array[nPos] = nPos+1; 		pList = g_slist_append(pList, "first"); 	} 	g_print("begin\n"); 	GSList* node; 	for(node = pList; node != NULL; node = node->next) 		g_print("%p--------%d\n", node->data); 	g_slist_free(pList);  	return 0; }  GSList  g_slist_append崩溃  附上一个正确例子：  #include <glib.h> #include <stdio.h>  int main(int argc, char** argv) {  	GSList* list = NULL;  	printf("The list is now %d items long\n", g_slist_length(list));  	list = g_slist_append(list, "first");  	list = g_slist_append(list, "second");  	printf("The list is now %d items long\n", g_slist_length(list));  	g_slist_free(list);  	return 0;  }   它也是用 g_slist_append  GSList

user: user-1
content: 引用 4 楼 caddor9100 的回复:#include <glib.h> #include<glib/glist.h>  int main() {  	GSList* pList; 	const gint nSize = 10; 	int nx; 	gint array[nSize] ;   	gint nPos = 0; 	for(nPos = 0; nPos < nSize; nPos++) 	{ 		array[nPos] = nPos+1; 		g_list_append(pList, &array[nPos]); 	} 	GSList *st; 	g_print("begin\n"); 	for (nPos = 0; nPos < nSize; nPos++) 	{ 		st = g_slist_nth(pList, nPos); 		g_printf("%d,", *(gint*)(st->data)); 	}	 	g_slist_free(pList); 	g_print("begin\n");  	return 0; }    c 语言。 gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)   崩溃 17行 g_list_append(pList, &array[nPos]); ===> g_slist_append(pList, &array[nPos]);

user: user-1
content: GSList mylist; g_slist_free(&mylist); 这两个是单链表的函数  这两个是双链表的函数 g_list_append(&mylist, (int*)&nval1); g_list_append(&mylist, (int*)&nval1);  如果使用GList, 楼主可以这么改  #include <stdio.h>  #include <glib.h>  static void show(GList *list) {         GList *node;          for (node = list; node != NULL; node = node->next)         {                 printf("node=%p->%d\n", node, *(int *)(node->data));         } }  int main() {         GList *list = NULL;         GList *node;         int nval1 = 1;         int nval2 = 2;         int nval3 = 3;          list = g_list_append(list, &nval1);         show(list);          list = g_list_append(list, &nval2);         show(list);          list = g_list_prepend(list, &nval3);         show(list);          g_list_free(list);          return 0; }  /* 输出类似: node=0x1d334e00->1 node=0x1d334e00->1 node=0x1d334e20->2 node=0x1d334e40->3 node=0x1d334e00->1 node=0x1d334e20->2 */

user: user-0
content: #include <glib.h> #include<glib/glist.h>  int main() {  	GSList* pList; 	const gint nSize = 10; 	int nx; 	gint array[nSize] ;   	gint nPos = 0; 	for(nPos = 0; nPos < nSize; nPos++) 	{ 		array[nPos] = nPos+1; 		g_list_append(pList, &array[nPos]); 	} 	GSList *st; 	g_print("begin\n"); 	for (nPos = 0; nPos < nSize; nPos++) 	{ 		st = g_slist_nth(pList, nPos); 		g_printf("%d,", *(gint*)(st->data)); 	}	 	g_slist_free(pList); 	g_print("begin\n");  	return 0; }    c 语言。 gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)   崩溃

user: user-0
content: 当前目录下没搜索到，  而且代码也不知道为什么会崩溃。

user: user-2
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-3
content: http://www.cnblogs.com/aoyihuashao/archive/2012/09/14/2684605.html    任务发生异常，需要记录遗言信息，利用gdb调试，因此需要记录coredump文件。  设置查看：  在root用户下执行sysctl -a | grep core，查看core文件的配置是否正确  命令设置：  1）使用命令 ulimit -c unlimited 设置coredump文件可以使用最大空间；  　　或去vi /etc/security/limits.conf修改  2）/proc/sys/kernal/core_pattern 可以设置coredump产生的路径和文件名格式。如果不修改，默认在程序执行目录下产生。   　　或使用命令修改：  　　　　sysctl -w kernel.core_pattern=/core/core.%e.%p  如果设置了上述两点，还是不能产生coredump，可能是以下原因：  1） 有些信号量默认是不产生coredump的，可以用 man signal  看一下。  2） 硬盘空间不够了，coredump需要占用很大的硬盘空间（上G的空间）；  3） ulimit -c 命令只在当前terminal上有效，也就是程序启动的terminal设置该命令才有效。该命令无效，当然就不能产生coredump了。