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