我在C中有一个赋值来实现抽象数据类型STACK。数据类型的性质需要需要分配内存的密钥结构。我的问题是,我的教师现在坚持要求初始化函数接收指向键结构的指针。 init()函数只会分配结构所需的内存并将字段设置为零,但传入的指针需要分配该内存位置。
如果没有函数返回指针或者传入2星指针,我无法想到这样做的方法 - 两者都是不允许的。我知道函数原型必须是(其中stackT *是指向键STACK数据结构的指针):
void init(stackT* stack);
我想出了这个并且它工作正常:
void init(stackT** stack){
*stack = (stackT*) malloc(sizeof(stack));
(*stack)->count = 0;
return;
}
但它不遵守任务的限制。
tl; dr版本:
基本上,我如何将原始指针的地址传递给STACK数据结构(& stackPtr)到一个函数中,该函数将一星指针作为参数而不是获得指针类型警告?此外,一旦你将参数更改为(stackT* stack)
,下面的代码就不起作用,即使我以同样的方式传递相同的东西 - 这就是我的问题所在。
我认为如果你打算传入一个指向指针的指针,那么将参数作为一个2星指针是必需的。当你取消引用一个指针时,编译器必须知道它正在处理什么。
无论如何,鉴于这些限制,我不确定如何做到这一点。在我看来,这只会让它变得更加困难。
答案 0 :(得分:3)
我相信,正如评论中指出的那样,你错过了这个意图。
我认为这个想法是“root”stackT
实例应该是一个众所周知的结构,这样你就可以在本地声明一个。然后调用init()
来设置stackT
实例描述的实际堆栈:
int push_four(void)
{
stackT my_stack;
init(&my_stack);
push(&my_stack, 1);
push(&my_stack, 2);
push(&my_stack, 3);
push(&my_stack, 4);
}
以上假设堆栈存储整数,即init()
内的分配应该是这样的:
void init(stackT *stack)
{
stack->items = malloc(64 * sizeof *items);
stack->count = 0;
}
反过来,这会产生如下声明:
typedef struct {
int *items;
size_t count;
} stackT;
当然,默认的最大深度(64)应该是init()
的参数,你必须检查(但不是强制!)malloc()
的返回值,依此类推。
答案 1 :(得分:2)
通常当你有复杂的结构时,就会有一个控件struct
,并且会有一个指向实际内存的指针。
示例:
struct stack_control_s {
void * memory;
size_t memory_size;
size_t current_size;
};
然后你将一个指向控制结构的指针传递给你的初始化器并让它完成真正的工作;
#define STACK_MIN_SIZE 0x100
int stack_init(struct stack_control_s * stack) {
memset(stack, 0, sizeof(*stack));
stack->memory = calloc(STACK_MIN_SIZE, 1);
if (!stack->memory)
return -1; //error
stack->memory_size = STACK_MIN_SIZE;
return 0; // all good
}
这是我曾经做过的通用C列表的略微修改的标题。我已添加到宏以使其可用作堆栈。也许这会给你一些灵感:
使用:
list_t(char) mylist;
list_init(&mylist);
list_push(&mylist, 'A');
printf("%c\n", list_pop(&mylist));
答案 2 :(得分:1)
可能它不是最佳解决方案,但您可以全局定义堆栈。
在这种情况下,它看起来像:
stackT G_stack;
....
void init(stackT* stack){
stack->count = 0;
return;
}
int main() {
.....
init(&G_stack);
.....
}
在这种情况下,您无需更改原型。
答案 3 :(得分:1)
这指定了STACK定义地址的指针,并传递了要初始化的指针(使用单个* :) ...这对你有用吗?
#include <ansi_c.h>
typedef struct {
int count;
} COUNT;
typedef struct {
COUNT count;
int *element1;
int *element2;
int address;
} STACK;
STACK stack, *pStack;
void InitStack(STACK *iS);
int main(void)
{ //This is how I think you will meet the
//criteria you are talking about (single *)
pStack = &stack; //assigning address of stack to pointer
InitStack(pStack);
//pStack->address == pStack
return 0;
}
void InitStack(STACK *iS)
{
iS->count.count = 0;
iS->address = (int)iS; //assigning address of stack to member of struct
iS->element1 = calloc(10, sizeof(int));
iS->element2 = calloc(10, sizeof(int));
}