c-生成指针数组时出错



试图为某些赋值实现以下代码,但在生成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("YOn");
        return 0;
    }

编辑:


我不能把它移到main,因为我必须在不同的函数中全局访问堆栈。因为Stack数组在转到另一个函数时会被销毁。在这里检查http://ideone.com/5wpZsp,


当我在全局范围内给出静态声明时,它会顺利工作,如下所示:http://ideone.com/3vx9fz

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

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

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

EDIT一个示例显示了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("%pn", stack);
    printf("%dn", 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;
}

步骤1:将stack的声明移动到main中。没有理由在全球范围内宣布:

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

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

第三步:放下石膏;这是不必要的1,只会增加视觉混乱。

步骤4:在malloc:的自变量中使用sizeof *stack而不是sizeof (NODEPTR)

stack = malloc( sizeof *stack * 20 );

结果是一样的,但这更容易阅读,并且如果您更改stack的类型,可以避免维护方面的麻烦。

第5步:完成后free您的堆栈。是的,对于这个项目来说,这并不重要,但这是一个很好的习惯。

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

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

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

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

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

出于类似的原因,我倾向于不对结构类型进行typedef,但我怀疑我在这方面是个异类。

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


1-在C中,即;在C++中,强制转换是必需的,但如果您正在编写C++,则无论如何都应该使用new而不是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;
   int main()
   {
    stack=malloc(sizeof(NODEPTR)*20);
    printf("YOn");
    return 0;
  }

这会奏效的。

分配内存(malloc)您的主.

没有必要对malloc的输出进行类型转换。有关更多信息,请参阅这篇文章

编辑:

在您的评论中,您提到当您移动其他函数时,内存将被破坏。

这不是真的。一旦您使用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 : %sn", str);
    passMalloc(&str);
    printf("Main after pass : %snn", str);
    free(str);
    return 0;
}
void passMalloc(char **str)
{
    strcpy(*str, "GoodEvening");
    printf("Function Def : %sn", *str);
}

相关内容

  • 没有找到相关文章

最新更新