繁体   English   中英

C-通过传递指针来更改函数外部变量的值

[英]C - Changing the value of a variable outside of a function by passing pointers

我在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星指针。.取消引用指针时,编译器必须知道其处理的内容。

无论如何,鉴于这些限制,我不确定如何执行此操作。 我认为这只会使其变得不必要地困难。

正如评论中所指出的那样,我相信您错过了这个意图。

我认为这个想法是“根” 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()的返回值,依此类推。

通常,当您具有复杂的结构时,就会有一个控制struct并且该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.h

采用:

list_t(char) mylist;
list_init(&mylist);

list_push(&mylist, 'A');

printf("%c\n", list_pop(&mylist));

也许这不是最好的解决方案,但是您可以全局定义堆栈。

在这种情况下,它将看起来像:

stackT G_stack;
....

void init(stackT* stack){
    stack->count = 0;
    return;
}

int main() {
    .....
    init(&G_stack);
    .....
}

在这种情况下,您无需更改原型。

这为指针分配了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));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM