生成指针数组时出错

时间:2013-08-26 16:41:44

标签: c arrays data-structures struct malloc

尝试为某些赋值实现下面的代码,但是为malloc数组生成得到错误“[错误]'堆栈'的冲突类型”任何帮助? 在此先感谢。

#include<stdio.h>
   #include<stdlib.h>

    struct treenode
    {
        char info;
        struct treenode *firstchild;
        struct treenode *next;
        int flag;
    };

    typedef struct treenode *NODEPTR;
    NODEPTR *stack;
    // Trying to create array here
    stack=(NODEPTR*)malloc(sizeof(NODEPTR)*20);


    int main()
    {
        printf("YO\n");
        return 0;
    }

编辑:


我无法将其移动到main,因为我必须在不同的函数中全局访问堆栈。 因为堆栈数组在转到另一个函数时会被销毁。 点击此处http://ideone.com/5wpZsp


当我全局给出静态声明时,它可以顺利运行,在这里:http://ideone.com/3vx9fz

4 个答案:

答案 0 :(得分:2)

您无法在全球范围内调用分配操作。请改为malloc中的main()操作。

stack的类型不是指针,而是指向指针的指针。你确定它的声明吗?

答案 1 :(得分:1)

将堆栈的初始化移动到main方法的内部。

编辑显示malloc数据如何持久保存到其他函数调用的示例,即使在main内部调用malloc也是如此。

#include<stdio.h>
#include<stdlib.h>

struct treenode
{
    char info;
    struct treenode *firstchild;
    struct treenode *next;
    int flag;
};

typedef struct treenode *NODEPTR;
NODEPTR *stack;

void test_stack() 
{
    printf("%p\n", stack);
    printf("%d\n", stack[19]->flag);
}
int main()
{
    // Trying to create array here
    stack=(NODEPTR*)malloc(sizeof(NODEPTR)*20);
    stack[19] = (NODEPTR*)malloc(sizeof(struct treenode));
    stack[19]->flag = 42;
    test_stack();
    return 0;
}

答案 2 :(得分:0)

#include<stdio.h>
#include<stdlib.h>

struct treenode
    {
    char info;
    struct treenode *firstchild;
    struct treenode *next;
    int flag;
    };
    typedef struct treenode *NODEPTR;
    NODEPTR *stack;
   int main()
   {

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

    printf("YO\n");
    return 0;
  }

这样可行。

在内部分配内存(malloc)你的主要内容。

没有必要对malloc进行类型转换。有关详细信息,请参阅this帖子

编辑:

在你的评论中,你提到当你移动其他功能时内存将被销毁

事实并非如此。一旦使用malloc分配内存,在调用free()之前不会销毁它。

因此,如果要在其他函数中访问malloc'ed变量,请将变量作为参数传递给其他函数。

请参阅下面的示例程序

    #include<stdio.h>
#include<stdlib.h>
#include <string.h>
char *str;
void passMalloc(char **str);

int main()
{
    str = malloc(100 * sizeof(char));
    strcpy(str, "GoodMorning");
    printf("\nMain before pass : %s\n", str);
    passMalloc(&str);
    printf("Main after pass : %s\n\n", str);
    free(str);
    return 0;
}

void passMalloc(char **str)
{
    strcpy(*str, "GoodEvening");
    printf("Function Def : %s\n", *str);
}

答案 3 :(得分:0)

第1步:在stack内移动main的声明。它没有理由在全球范围内宣布:

int main( void )
{
  NODEPTR *stack;
  ...

步骤2:将malloc调用移到main内(您无法在函数外执行赋值或函数调用)。

第3步:放弃演员;这是不必要的 1 ,只会增加视觉上的混乱。

第4步:在sizeof *stack的参数中使用sizeof (NODEPTR)而不是malloc

stack = malloc( sizeof *stack * 20 );

结果相同,但如果您更改stack的类型,则更容易阅读,并避免维护问题。

第5步:完成后,free你的筹码。是的,对于这个项目而言并不重要,但这是一个很好的习惯。

所以在这之后,你的代码应该是:

int main( void )
{
  NODEPTR *stack;
  stack = malloc( sizeof *stack * 20 );
  ...
  free( stack );
  return 0;
}

Stylistic nit:隐藏typedef背后的指针类型是坏juju IME。指针语义是重要的,如果程序员需要取消引用NODEPTR类型的对象(明确地,(*node).info或隐式地取消node->info ),那么通常最好使用指针声明语法声明该对象,类似

typedef struct treenode Node;
Node *node;
Node **stack;
...
stack[i]->next = node->next;

等。所以使用你的类型的人确切地知道涉及多少级别的间接,并且可以相应地编写他们的代码(多个间接并不难)。如果该类型是真正 opaque并且永远不会直接解引用,而只是传递给处理所有这些的API,那么隐藏该类型的指针就可以了。否则,请将其暴露。

由于类似的原因,我倾向于不输入结构类型,但我怀疑在这方面我是一个异常值。

啊,谁破坏了代码格式化程序?!

<小时/> 1 - 在C中,即;在C ++中,强制转换,但如果您正在编写C ++,那么无论如何都应该使用new而不是malloc