通过设置指针为NULL初始化在C叠

我试图按照下面的头(stack.h)用C来实现堆栈:

#ifndef STACK_H #define STACK_H /* An element from which stack is consisting */ typedef struct stack_node_ss { struct stack_node_ss *next; /* pointer to next element in stack */ void *value; /* value of this element */ } stack_node_s; /* typedef so that stack user doesn't have to worry about the actual type of * parameter stack when using this stack implementation. */ typedef stack_node_s* stack_s; /* Initializes a stack pointed by parameter stack. User calls this after he * has created a stack_t variable but before he uses the stack. */ void stack_init(stack_s *stack); /* Pushes item to a stack pointed by parameter stack. Returns 0 if succesful, * -1 otherwise. */ int stack_push(void *p, stack_s *stack); /* Pops item from a stack pointed by parameter stack. Returns pointer to * element removed from stack if succesful, null if there is an error or * the stack is empty. */ void *stack_pop(stack_s *stack); #endif

然而,作为新的有C,我被堵在stack_init功能,我已经写在stack.c:

#include <stdlib.h> #include <stdio.h> #include "stack.h" void stack_init(stack_s *stack) { (*stack)->value = NULL; (*stack)->next = NULL; }

主程序开始:

int *tmp; stack_s stack; stack_init(&stack);

而这一崩溃我的程序有:

Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000008 0x0000000100000abf in stack_init (stack=0x7fff5fbffb30) at stack.c:6 6 (*stack)->value = NULL;

你可以暗示我在正确的轨道? 非常感谢。

--------------解决方案-------------

你必须为分配内存**stack本身:

*stack = malloc(sizeof(**stack));

但是,请不要的typedef指针类型。 这真是混乱,难以阅读。 更好地按值传递指针,它留给调用者来存储指针,就像这样:

typedef struct stack_node_t
{
struct stack_node_t * next;
/* ... */
} stack_node;

stack_node * create_stack()
{
stack_node * res = calloc(1, sizeof(stack_node));
return res;
}

void destroy_stack(stack_node * s)
{
if (!next) return;

stack_node * next = s->next;
free(s);
destroy_stack(next);
}

// etc.

然后,你可以说:

stack_node * s = create_stack();

// use s

destroy_stack(s);
s = NULL; // some people like this

您正在访问一个未初始化的指针,从而导致未定义的行为。

因为这个功能是创建一个新的堆栈,需要分配一些动态内存堆栈,然后将指针指向新分配的内存:

void stack_init(stack_s *stack) {
*stack = malloc(sizeof(**stack)); // create memory for the stack

(*stack)->value = NULL;
(*stack)->next = NULL;
}

stack_s stack;
stack_init(&stack);

那么你应该有一个函数调用stack_destroy ,将free动态内存,并设置指针NULL

void stack_destroy(stack_s *stack) {
free(*stack);
*stack = NULL;
}

你应该堆栈初始化为NULL - 而不是一个NULL值推到它:

void stack_init(stack_s *stack) {
*stack=NULL;
}

分类:C# 时间:2012-01-01 人气:0
本文关键词: 链表,空,初始化
分享到:

相关文章

  • 插上找到空初始化 2012-08-03

    我最近发现有空初始化的对象是从http://www.codinghorror.com/blog/archives/000343.html我有一个巨大的C#代码库,其中在许多这样的初始化都是由开销,我想知道如果有任何免费的插件来帮我更换它.我试图寻找关于网,但没有免费的插件:( --------------解决方案------------- 这不一定会自动帮你解决这些问题,但是如果你安装独立的FxCop 1.36,您可以打开刚治CA1805,这会发现所有你initializng不必要的地方. (这

  • 是常规变量空初始化,或者这是一个错误的IntelliJ? 2014-09-27

    的IntelliJ将以灰色突出的'富'的变量,并说"转让未使用". 我想知道的是 - 它是正确的或不... 如果这是Java,而不是常规的,我知道这是不对的. public class Foo { public Foo() { Foo foo = null; // this 'foo' instance is gray ("assignment not used") try { foo = new Foo() // ... } finally { if (foo !

  • 空初始化数组的数组 2014-06-10

    这是我的代码: a = [[]] * 10 a[0].append(1) print a # Outputs [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]] 我怎样才能得到a输出 [[1], [], [], [], [], [], [], [], [], []] ? --------------解决方案------------- 尝试 a=[[] for i in xrange(10)] 在你的代码要添加同一列表的10倍. 下面的输出应该澄清

  • 是空的初始化首选的默认初始化会员积分? 2014-04-13

    我刚刚看了一个评论者GMAN的 class A { public: A() : m_ptr() // m_ptr is implicitly initialized to NULL { } }; 应优先于 class A { public: A() : m_ptr(NULL) // m_ptr is explicitly initialized to NULL { } }; 注意缺乏NULL在第一个例子. GMAN是正确的? 这可能有点主观, 所以 " 你喜欢的默认初始化空初始化?"可

  • 未初始化的布尔C ++ 2014-02-05

    我构造模板结构,我需要一些技巧来做到以下几点: 我有一个单独维和二维链表,我需要先建立每个节点用后,我有从一个文件中的数据,以填补他们在其中没有任何数据. 所以,我需要if(x == UNINITIALIZED OR NOT) ,因为数据可能是字符串,int和double. 我无法找到一个共同的空初始化只是,如果检查. 我希望有一种方法可以做到这一点. 我想if(x == NULL) if(x == 0) if(x == "") if(x == void) . 他们没有工作. ----

  • 关于C 2-D数组初始化++ 2012-05-15

    我得到在C 2-D数组初始化++这个问题,不同的反应. 这里的情景: class MyClass { private: static char my2dArray[10][20]; }; char MyClass::my2dArray[10][20] = {{0}}; 现在,这是否初始化这个数组0的所有元素? 另外,如果我有以下类型定义: typedef unsigned char u8; 而这个数组是static u8 my2dArray[10][20]将在同一初始化工作? 假设它是强制性的,

  • 如何初始化之外的foreach VAR 2012-07-02

    我想在foreach循环之外初始化变种. 这里是我的代码: public List<Course> GetCourse() { IList<Semester> semesters = Semester.Get(); foreach (Semester sm in semesters) { IList<CourseInstance> courseInstances = CourseInstance.Get(sm[0].SemesterId); var courseInfo

  • 空VS选项在F# 2012-12-13

    我理解"空"和Option F#中的共存问题. 在一本书我已阅读,空值是不是在F#一个合适的值,因为这样F#消除了过多的空检查. 但它仍然允许在F#空初始化引用. 换句话说,你可以有空值,但你没有武器捍卫自己与. 为什么不能完全替换选项空值. 是不是因为与.NET库或语言的兼容性问题,它仍然在那里? 如果是的话,你可以给说明为什么它不能被选来代替的例子吗? --------------解决方案------------- F#避免使用null当可能的,但生活在.NET的生态系统,因此它不

  • 我怎么能初始化这个信号 2013-07-26

    我问这个问题有关servlet的多线程,许多人建议使用一个静态变量. 如果我设置一个静态变量,我需要初始化. 例如公共静态信号量许可证; 起初,我试图和servlet相关的过滤器的init()方法来初始化: public void init(FilterConfig conf) throws ServletException { // TODO Auto-generated method stub try{ limit = Integer.parseInt(conf.getInitParamet

  • 默认初始化与值初始化 2013-12-07

    从这个答案,在C ++ 03,一个POD类型得到默认,如果初始化()被省略,否则很值初始化. // POD type struct foo { int x; }; // value-initialized new foo(); 但是,如果提供了用户定义的构造,是任何下面将被视为对象的默认或值初始化? // non-POD type struct bar { bar(int x = 0):x(x) {} int x; }; new bar(); new bar(42); -------------

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.598 (s). 10 q(s)