2

尝试为某些分配实现以下代码,但在生成 malloc 数组时出现错误“[Error] 'stack' 的类型冲突”任何帮助?提前致谢。

#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

4 回答 4

2

您不能在全局范围内调用赋值操作。请尝试malloc操作main()

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

于 2013-08-26T16:44:05.397 回答
1

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

编辑一个例子,展示了 malloc 数据如何持续到其他函数调用,即使 malloc 是在 main 内部调用的。

#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;
}
于 2013-08-26T16:50:41.567 回答
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)你的 main.

无需对 malloc 进行类型转换。有关更多信息,请参阅帖子

编辑 :

在您的评论中,您提到移动其他功能时内存将被破坏

这不是真的。一旦你使用 malloc 分配内存,在你调用 free() 之前它不会被销毁。

因此,如果您想访问其他函数中的 malloc 变量,请将变量作为参数传递给其他函数。

请参阅下面的示例程序

    #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);
}
于 2013-08-26T16:48:09.023 回答
0

第 1 步:移动stackinside的声明main。没有理由应该在全球范围内声明它:

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

第 2 步:将malloc调用移到内部main(不能在函数外部执行赋值或函数调用)。

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

第 4 步:在 to的参数中使用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;
}

风格 nit:在 typedefs 后面隐藏指针类型是不好的 juju IME。指针语义很重要,如果期望程序员取消引用类型的对象NODEPTR(显式地 as(*node).info或隐式 as node->info),那么通常最好使用指针声明语法来声明该对象,例如

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

等等,因此使用您的类型的人确切地知道涉及多少间接级别,并且可以相应地编写他们的代码(多重间接并不难)。如果该类型是真正不透明的并且从不直接取消引用,而只是传递给处理所有这些的 API,那么隐藏该类型的指针是可以的。否则,让它暴露在外。

出于类似的原因,我倾向于不 typedef struct types,但我怀疑我在这方面是一个异常值。

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


1 - 在 C 中,即;在 C++ 中,强制转换必需的,但如果您正在编写 C++,则应该使用new而不是malloc无论如何。

于 2013-08-26T18:28:22.823 回答