【问题标题】:Passing a value with struct type into a function in C将具有结构类型的值传递给C中的函数
【发布时间】:2010-09-22 02:44:57
【问题描述】:
typedef struct {
        nat id;
        char *data;
        } element_struct;

typedef element_struct * element;

void push(element e, queue s) {
        nat lt = s->length;
        if (lt == max_length - 1) {
                printf("Error in push: Queue is full.\n");
                return;
        }
        else {
                s->contents[lt] = e;
                s->length = lt + 1;
        }
}
int main () {
         push(something_of_type_element, s);
}

我将如何格式化“something_of_type_element”?

谢谢

注意事项: nat 和 int 一样

【问题讨论】:

  • 这只是我的看法,但我认为 typedef 指针类型相当混乱。为了清楚起见,我只会对结构进行 typedef。这样,阅读您的代码的人就会知道正在处理指针,而不必知道 typedef。

标签: c data-structures struct


【解决方案1】:

像这样:

element_struct foo = { 1, "bar" };
push(&foo, s);

如果你有 C99 编译器,你可以这样做:

element_struct foo = {
    .id = 1,
    .data = "bar"
};
push(&foo, s);

请注意,如果结构中的数据需要比定义的范围更长,则必须复制结构中的数据。否则,可以使用 malloc(见下文)在堆上分配内存,或者可以使用全局或静态变量。

element_struct foo = malloc(sizeof (element_struct));

foo.id = 1;
foo.data = "bar";
push(foo, s);

【讨论】:

  • 一旦你要在调用 push() 的函数之外使用队列内容,这将表现得非常奇怪,因为像这样定义的结构将存在于它的堆栈上并被销毁一次函数退出。
【解决方案2】:

怎么样:

element elem = malloc(sizeof(element_struct));
if (elem == NULL) {
    /* Handle error. */
}

elem->id = something;
elem->data = something_else;

push(elem, s);

请注意,这里缺少很多内存管理...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2013-04-12
    • 2015-01-03
    • 2015-09-24
    • 2018-05-09
    相关资源
    最近更新 更多