免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7056 | 回复: 7
打印 上一主题 下一主题

[C] malloc产生的结构体的指针成员(野指针)不能初始化? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-22 15:13 |只看该作者 |倒序浏览
想写一个这是一个简单的栈创建和初始化的例子,调试通过,但是运行的时候出现Segmentation fault(coredump)的错误,dbx调试发现调用push函数调用“elem->data = data”出错,想了好久想不清,请问哪位可以帮忙看看,谢谢!
程序如下:

#include <stdio.h>
#include <malloc.h>
#include <string.h>


typedef struct elementT
{
&nbsp;&nbsp;&nbsp;&nbsp;struct elementT *next;
&nbsp;&nbsp;&nbsp;&nbsp;void *data;
}element;

int push(element **stack, void *data)
{
&nbsp;&nbsp;&nbsp;&nbsp;element *elem = NULL;

&nbsp;&nbsp;&nbsp;&nbsp;elem = (element *)malloc(sizeof(element));
&nbsp;&nbsp;&nbsp;&nbsp;printf("stack address[%p,%p], elem address[%p], data[%c], data address[%p]\n",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack, *stack, elem, *(char *)data, data);&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if(!elem)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;elem->data = data; /** 这里elem->data不能初始化???*/
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;elem->next = *stack;
&nbsp;&nbsp;&nbsp;&nbsp;*stack = elem;

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

int creat_stack(element **stack)
{
&nbsp;&nbsp;&nbsp;&nbsp;*stack = NULL;
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

int main(int argc, char *argv[])
{
&nbsp;&nbsp;&nbsp;&nbsp;char data_c[20] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
&nbsp;&nbsp;&nbsp;&nbsp;int  data_i[20] = {1, 2, 3, 4, 5, 6, 7};
&nbsp;&nbsp;&nbsp;&nbsp;int i, ret=0;
&nbsp;&nbsp;&nbsp;&nbsp;element *stack_c, *stack_i;

&nbsp;&nbsp;&nbsp;&nbsp;creat_stack(&stack_c);
&nbsp;&nbsp;&nbsp;&nbsp;creat_stack(&stack_i);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i<7; i++)
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = push(&stack_c, (void *)&data_c[i]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ret)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("push element to stack_c error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}  &nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = push(&stack_i, (void *)&data_i[i]);         
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ret)        
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("push element to stack_i error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}      &nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;}
}


[ 本帖最后由 kyle218 于 2007-11-22 17:07 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-11-22 15:55 |只看该作者
element *stack_c, *stack_i;

stack_c没有初始化,这样改改看。
element *stack_c, *stack_i,stack_t;
statck_c = &stack_t;

论坛徽章:
0
3 [报告]
发表于 2007-11-22 16:10 |只看该作者
creat_stack(&stack_c);
这个与
stack_c = NULL;有区别吗?

ps:在我这里,程序是没有段错误的。

论坛徽章:
0
4 [报告]
发表于 2007-11-22 16:45 |只看该作者
谢谢两位,
我晕,但是我用在AIX上cc编译执行就Segmentation       fault(coredump),我用win-tc编译运行也没问题,什么问题呢?
难道编译器的区别?

论坛徽章:
0
5 [报告]
发表于 2007-11-22 16:47 |只看该作者
ret = push(&stack_c, (void *)&data_c); 这句中
data_c就是一级指针, &data_c是二级指针
然后你将这个二级指针强制转换为(void *),即为一级空指针
可能会出问题的
还有这句也是一样的
push(&stack_i, (void *)&data_i);

论坛徽章:
0
6 [报告]
发表于 2007-11-22 17:04 |只看该作者
原帖由 hyrish 于 2007-11-22 16:47 发表
ret = push(&stack_c, (void *)&data_c); 这句中
data_c就是一级指针, &data_c是二级指针
然后你将这个二级指针强制转换为(void *),即为一级空指针
可能会出问题的
还有这句也是一样的
push(&stack_i, (v ...

不好意思,我没有用插入代码的方式发表代码,出错了
我现在修改一下

[ 本帖最后由 kyle218 于 2007-11-22 17:05 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-11-22 17:32 |只看该作者
在csdn上找到了答案
---------------------------------------------------------------------------------------------  
在aix中使用malloc需要包含头文件   
#include       <stdlib.h>   
这个可能与window下不同   
不然编译时是没问题,但是执行时都会报内存错误的
---------------------------------------------------------------------------------------------  
问题解决了,的确是这个问题,加上#include   <stdlib.h>   就执行正确了,
呵呵,还是要多谢多谢各位^_^

这样的错误防不慎防啊,怎么加强呢?

论坛徽章:
0
8 [报告]
发表于 2007-11-22 17:37 |只看该作者
本来用数组建栈更方便,但是我想写一个数组大小没有限制,data数据元素任何类型的通用栈,所以我这么做,下面是完整的程序
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>


typedef struct elementT
{
&nbsp;&nbsp;&nbsp;&nbsp;struct elementT *next;
&nbsp;&nbsp;&nbsp;&nbsp;void *data;
}element;

int push(element **stack, void *data)
{
&nbsp;&nbsp;&nbsp;&nbsp;element *elem = NULL;

&nbsp;&nbsp;&nbsp;&nbsp;elem = (element *)malloc(sizeof(element));
&nbsp;&nbsp;&nbsp;&nbsp;/*printf("stack address[%p,%p], elem address[%p], data[%c], data address[%p]\n",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack, *stack, elem, *(char *)data, data);    */

&nbsp;&nbsp;&nbsp;&nbsp;if(!elem)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;elem->data = data;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;elem->next = *stack;
&nbsp;&nbsp;&nbsp;&nbsp;*stack = elem;

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

int pop(element **stack, void **data)
{
&nbsp;&nbsp;&nbsp;&nbsp;element *elem;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if(!(elem = *stack))
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1; /** the stack is null*/
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;*data = elem->data;
&nbsp;&nbsp;&nbsp;&nbsp;*stack = elem->next;
&nbsp;&nbsp;&nbsp;&nbsp;free(elem);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

int creat_stack(element **stack)
{
&nbsp;&nbsp;&nbsp;&nbsp;*stack = NULL;
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

int delete_stack(element **stack)
{
&nbsp;&nbsp;&nbsp;&nbsp;element *elem;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;while(!(*stack))
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elem = (*stack)->next; /** not elem = *stack->next;*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(elem);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*stack) = elem;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

int main(int argc, char *argv[])
{
&nbsp;&nbsp;&nbsp;&nbsp;char data_c[20] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
&nbsp;&nbsp;&nbsp;&nbsp;int  data_i[20] = {1, 2, 3, 4, 5, 6, 7};
&nbsp;&nbsp;&nbsp;&nbsp;int i, ret=0;
&nbsp;&nbsp;&nbsp;&nbsp;element stack_char, stack_int, *stack_c, *stack_i;
&nbsp;&nbsp;&nbsp;&nbsp;char *p_c;
&nbsp;&nbsp;&nbsp;&nbsp;int *p_i;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;creat_stack(&stack_c);
&nbsp;&nbsp;&nbsp;&nbsp;creat_stack(&stack_i);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i<7; i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = push(&stack_c, (void *)&data_c[i]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ret)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("push element to stack_c error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}      

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = push(&stack_i, (void *)&data_i[i]);         
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ret)        
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("push element to stack_i error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}      
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i<7; i++)   
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = pop(&stack_c, (void **)&p_c);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ret)        
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("pop element to stack_c error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}               
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("pop stack_c element [%c]\n", *(char *)p_c);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i<7; i++)   
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = pop(&stack_i, (void **)&p_i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ret)        
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("pop element to stack_i error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}               
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("pop stack_i element [%d]\n", *(int *)p_i);      
&nbsp;&nbsp;&nbsp;&nbsp;}

}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP