尝试为某些赋值实现下面的代码,但是为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
答案 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
。