user-0 提问: 请教以下如何修改栈中存储类型？

回复:
user: user-1
content: 仅供参考：//使用动态分配 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int i,L; char *p; void main() {     for (i=0;i<20000;i++) {         L=rand();         p=malloc(L);         if (NULL==p) {             printf("malloc error!\n");             continue;         }         memset(p,0,L);         free(p);     } } //不使用动态分配 #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXLEN 30000 int i,L; char buf[MAXLEN]; char *p; void main() {     p=&buf[0];     for (i=0;i<20000;i++) {         L=rand();         if (L>MAXLEN) {             printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);             L=MAXLEN;         }         memset(p,0,L);     } }

user: user-2
content: 1樓的方法相對比較簡單易行，但這樣操作，有點劍走偏鋒的赶脚。不太容易理解，代碼不容易閱讀。 2樓的方法有一個問題，如果文件名長度超过30個字符，怎么處理？截斷？否則會溢出而踩內存。  綜合1，2樓的建議。個人建議可以把data一開始就改為成char*，當然使用过的地方都要改。同时對於內存操作尤其要小心。

user: user-3
content: typedef char Item[30];  其它还需做相应修改

user: user-4
content: 字符串是char *str,需要分配内存,强行转换一下 data=(int)str;

user: user-0
content: 引用 8 楼 zhangxiangDavaid 的回复:[quote=引用 6 楼 menghuanqilin 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 仅供参考：//使用动态分配 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int i,L; char *p; void main() {     for (i=0;i<20000;i++) {         L=rand();         p=malloc(L);         if (NULL==p) {             printf("malloc error!\n");             continue;         }         memset(p,0,L);         free(p);     } } //不使用动态分配 #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXLEN 30000 int i,L; char buf[MAXLEN]; char *p; void main() {     p=&buf[0];     for (i=0;i<20000;i++) {         L=rand();         if (L>MAXLEN) {             printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);             L=MAXLEN;         }         memset(p,0,L);     } }  谢谢了，可惜不是我需要的[/quote] 你没看懂这段代码哦！[/quote] 我保存文件名，直接分配100字节的空间就行了，复制也只复制100字节进去，动态分配也是可以的，感觉有点麻烦，不过还是谢谢了

user: user-3
content: 引用 6 楼 menghuanqilin 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 仅供参考：//使用动态分配 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int i,L; char *p; void main() {     for (i=0;i<20000;i++) {         L=rand();         p=malloc(L);         if (NULL==p) {             printf("malloc error!\n");             continue;         }         memset(p,0,L);         free(p);     } } //不使用动态分配 #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXLEN 30000 int i,L; char buf[MAXLEN]; char *p; void main() {     p=&buf[0];     for (i=0;i<20000;i++) {         L=rand();         if (L>MAXLEN) {             printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);             L=MAXLEN;         }         memset(p,0,L);     } }  谢谢了，可惜不是我需要的[/quote] 你没看懂这段代码哦！

user: user-0
content: 引用 3 楼 moritz_dev 的回复:1樓的方法相對比較簡單易行，但這樣操作，有點劍走偏鋒的赶脚。不太容易理解，代碼不容易閱讀。 2樓的方法有一個問題，如果文件名長度超过30個字符，怎么處理？截斷？否則會溢出而踩內存。  綜合1，2樓的建議。個人建議可以把data一開始就改為成char*，當然使用过的地方都要改。同时對於內存操作尤其要小心。 麻烦看看我提供的代码还有没有需要改进的 #include <malloc.h> #include <stdlib.h> #include <stdio.h> #include <string.h> typedef char		Item[100]; typedef struct node	* PNode; /*定义栈节点类型*/ typedef struct node { 	Item	data; 	PNode	down; }Node; /*定义栈类型*/ typedef struct stack { 	PNode	top; 	int	size; }Stack;  /*构造一个空栈*/ Stack *InitStack();   /*销毁一个栈*/ void DestroyStack( Stack *ps );   /*把栈置空*/ void ClearStack( Stack *ps );   /*判定是否为空栈*/ int IsEmpty( Stack *ps );   /*返回栈大小*/ int GetSize( Stack *ps );   /*返回栈顶元素*/ PNode GetTop( Stack *ps, Item *pitem );   /*元素入栈*/ PNode Push( Stack *ps, Item item );   /*元素出栈*/ PNode Pop( Stack *ps, Item *pitem );   /*遍历栈并访问visit函数*/ void StackTraverse( Stack *ps, void (*visit)() );   /*构造一个空栈*/ Stack *InitStack() { 	Stack *ps = (Stack *) malloc( sizeof(Stack) ); 	if ( ps != NULL ) 	{ 		ps->top		= NULL; 		ps->size	= 0; 	} 	return(ps); }   /*判定是否为空栈*/ int IsEmpty( Stack *ps ) { 	if ( ps->top == NULL && ps->size == 0 ) 		return(1); 	else 		return(0); }   /*返回栈大小*/ int GetSize( Stack *ps ) { 	return(ps->size); }   /*元素入栈*/ PNode Push( Stack *ps, Item item ) { 	PNode pnode = (PNode) malloc( sizeof(Node) ); 	if ( pnode != NULL ) 	{ 		memcpy( pnode->data, item, 100 ); 		pnode->down = GetTop( ps, NULL ); 		ps->size++; 		ps->top = pnode; 	} 	return(pnode); }   /*返回栈顶元素*/ PNode GetTop( Stack *ps, Item *pitem ) { 	if ( IsEmpty( ps ) != 1 && pitem != NULL ) 	{ 		/* *pitem = ps->top->data; */ 		memcpy( *pitem, ps->top->data, 100 ); 	} 	return(ps->top); }   /*元素出栈*/ PNode Pop( Stack *ps, Item *pitem ) { 	PNode p = ps->top; 	if ( IsEmpty( ps ) != 1 && p != NULL ) 	{ 		if ( pitem != NULL ) 			/*  *pitem = p->data; */ 			memcpy( *pitem, p->data, 100 ); 		ps->size--; 		ps->top = ps->top->down; 		free( p ); 	} 	return(ps->top); }   /*销毁一个栈*/ void DestroyStack( Stack *ps ) { 	if ( IsEmpty( ps ) != 1 ) 		ClearStack( ps ); 	free( ps ); }   /*把栈置空*/ void ClearStack( Stack *ps ) { 	while ( IsEmpty( ps ) != 1 ) 	{ 		Pop( ps, NULL ); 	} }   /*遍历栈并访问visit函数 */ void StackTraverse( Stack *ps, void (*visit)() ) { 	PNode	p	= ps->top; 	int	i	= ps->size; 	while ( i-- ) 	{ 		visit( p->data ); 		p = p->down; 	} }   void print( Item i ) { 	printf( "该节点元素为%s\n", i ); }   void   main() { 	Stack	*ps = InitStack(); 	int	i; 	char	path[100]; 	char	item[100]; 	printf( "0-9依次入栈并输出如下：\n" ); 	for ( i = 0; i < 10; i++ ) 	{ 		memset( path, 0, 100 ); 		sprintf(path, "pathfile:/etc/%d", i ); 		Push(ps, path); 		GetTop( ps, &item ); 		printf( "%s ", item ); 	}  	printf( "\n从栈顶到栈顶遍历并对每个元素执行print函数：\n" ); 	StackTraverse( ps, print);  	printf( "栈中元素依次出栈并输出如下：\n" ); 	for ( i = 0; i < 10; i++ ) 	{ 		Pop( ps, &item); 		printf( "%s ", item ); 	}  	ClearStack( ps ); 	if ( IsEmpty( ps ) ) 		printf( "\n将栈置空成功\n" ); 	DestroyStack( ps ); 	printf( "栈已被销毁\n" ); }

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:仅供参考：//使用动态分配 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int i,L; char *p; void main() {     for (i=0;i<20000;i++) {         L=rand();         p=malloc(L);         if (NULL==p) {             printf("malloc error!\n");             continue;         }         memset(p,0,L);         free(p);     } } //不使用动态分配 #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXLEN 30000 int i,L; char buf[MAXLEN]; char *p; void main() {     p=&buf[0];     for (i=0;i<20000;i++) {         L=rand();         if (L>MAXLEN) {             printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);             L=MAXLEN;         }         memset(p,0,L);     } }  谢谢了，可惜不是我需要的

user: user-0
content: 引用 2 楼 zhangxiangDavaid 的回复: typedef char Item[30];  其它还需做相应修改 谢谢你的提醒，我改好了，代码在下面，看看会不会造成内存溢出 #include <malloc.h> #include <stdlib.h> #include <stdio.h> #include <string.h> typedef char		Item[100]; typedef struct node	* PNode; /*定义栈节点类型*/ typedef struct node { 	Item	data; 	PNode	down; }Node; /*定义栈类型*/ typedef struct stack { 	PNode	top; 	int	size; }Stack;  /*构造一个空栈*/ Stack *InitStack();   /*销毁一个栈*/ void DestroyStack( Stack *ps );   /*把栈置空*/ void ClearStack( Stack *ps );   /*判定是否为空栈*/ int IsEmpty( Stack *ps );   /*返回栈大小*/ int GetSize( Stack *ps );   /*返回栈顶元素*/ PNode GetTop( Stack *ps, Item *pitem );   /*元素入栈*/ PNode Push( Stack *ps, Item item );   /*元素出栈*/ PNode Pop( Stack *ps, Item *pitem );   /*遍历栈并访问visit函数*/ void StackTraverse( Stack *ps, void (*visit)() );   /*构造一个空栈*/ Stack *InitStack() { 	Stack *ps = (Stack *) malloc( sizeof(Stack) ); 	if ( ps != NULL ) 	{ 		ps->top		= NULL; 		ps->size	= 0; 	} 	return(ps); }   /*判定是否为空栈*/ int IsEmpty( Stack *ps ) { 	if ( ps->top == NULL && ps->size == 0 ) 		return(1); 	else 		return(0); }   /*返回栈大小*/ int GetSize( Stack *ps ) { 	return(ps->size); }   /*元素入栈*/ PNode Push( Stack *ps, Item item ) { 	PNode pnode = (PNode) malloc( sizeof(Node) ); 	if ( pnode != NULL ) 	{ 		memcpy( pnode->data, item, 100 ); 		pnode->down = GetTop( ps, NULL ); 		ps->size++; 		ps->top = pnode; 	} 	return(pnode); }   /*返回栈顶元素*/ PNode GetTop( Stack *ps, Item *pitem ) { 	if ( IsEmpty( ps ) != 1 && pitem != NULL ) 	{ 		/* *pitem = ps->top->data; */ 		memcpy( *pitem, ps->top->data, 100 ); 	} 	return(ps->top); }   /*元素出栈*/ PNode Pop( Stack *ps, Item *pitem ) { 	PNode p = ps->top; 	if ( IsEmpty( ps ) != 1 && p != NULL ) 	{ 		if ( pitem != NULL ) 			/*  *pitem = p->data; */ 			memcpy( *pitem, p->data, 100 ); 		ps->size--; 		ps->top = ps->top->down; 		free( p ); 	} 	return(ps->top); }   /*销毁一个栈*/ void DestroyStack( Stack *ps ) { 	if ( IsEmpty( ps ) != 1 ) 		ClearStack( ps ); 	free( ps ); }   /*把栈置空*/ void ClearStack( Stack *ps ) { 	while ( IsEmpty( ps ) != 1 ) 	{ 		Pop( ps, NULL ); 	} }   /*遍历栈并访问visit函数 */ void StackTraverse( Stack *ps, void (*visit)() ) { 	PNode	p	= ps->top; 	int	i	= ps->size; 	while ( i-- ) 	{ 		visit( p->data ); 		p = p->down; 	} }   void print( Item i ) { 	printf( "该节点元素为%s\n", i ); }   void   main() { 	Stack	*ps = InitStack(); 	int	i; 	char	path[100]; 	char	item[100]; 	printf( "0-9依次入栈并输出如下：\n" ); 	for ( i = 0; i < 10; i++ ) 	{ 		memset( path, 0, 100 ); 		sprintf(path, "pathfile:/etc/%d", i ); 		Push(ps, path); 		GetTop( ps, &item ); 		printf( "%s ", item ); 	}  	printf( "\n从栈顶到栈顶遍历并对每个元素执行print函数：\n" ); 	StackTraverse( ps, print);  	printf( "栈中元素依次出栈并输出如下：\n" ); 	for ( i = 0; i < 10; i++ ) 	{ 		Pop( ps, &item); 		printf( "%s ", item ); 	}  	ClearStack( ps ); 	if ( IsEmpty( ps ) ) 		printf( "\n将栈置空成功\n" ); 	DestroyStack( ps ); 	printf( "栈已被销毁\n" ); }