繁体   English   中英

如何在C中传递结构指针?

[英]How do you pass a struct Pointer in C?

我对如何通过引用将指针传递到函数中感到有些困惑?

例如,这是我编写的一些代码(我没有复制整个功能,只是复制了一部分相关的内容)

  metadata * removeBlock(metadata *first)
{

    metadata *temp = first;
    if(first == NULL || first -> prev == NULL)
        {
            first -> in_use = 1;
            first = NULL;
            return temp;
        }
}

我想要的是当函数返回时,传入的原始值应设置为NULL。 这是我调用该函数的方式(这行代码将从堆中的某个区域提取元数据结构,它可以正常工作,我已经调试并确保在此之后,该结构确实指向有效的元数据结构)

metadata *strct = ((metadata *)ptr - sizeof(metadata));
removeBlock(strct);

但是,此方法返回后,strct仍与我在函数中传递它之前的值相同。 我尝试传递&strct,但这只是引发了无效的强制转换异常。 传递结构作为参数的最佳方法是什么?

谢谢。

我认为您想要的不是一个好的设计-如果函数的用户希望将指针设置为null(为什么?),则可以使用函数的返回值来重置该值。

无论如何,您将需要一个指向指针的指针,如下所示:

metadata* removeBlock(metadata** first) {

    metadata* temp = *first;
    if( temp == NULL ) return temp;

    if( temp->prev == NULL ) {
        temp->in_use = true;
        *first = NULL;
    }
    return temp;
}

metadata* strct = ((metadata*)ptr - sizeof(metadata));
removeBlock(&strct);

就像@SheerFish所说的,我们在C语言中所拥有的只是传递值。 但是,可以使用指针模拟通过引用。

void func(struct foo **fooptr) { *fooptr = 0; }
int main(int argc, char **argv) { struct foo *fooptr; func(&fooptr); }

ptr指针ptr传递给变量的值(如果该值是指针,则不要紧),从而允许函数使用*ptr来使用原始值。 这项技术有时称为传递地址,是C必须通过引用传递的最接近的地址。

如果通过“在C中引用”传递,则需要牢记通过-> / **和*进行引用和取消引用。 我写的这段代码可能会对您有所帮助

    int delete_node(struct node** head, int target)
    {

        if(*head == NULL)
            return 0;                                                    
    if((*head)->data == target)
        {
            temp = *head;
            *head = (*head)->next;
            free(temp);
            return 1;
        }                                                    
} 

函数调用:

 delete_node(&head, data)

您正在使用直接内存指针操作。 您要在内存中扔掉该结构的位置,取消引用它,然后在该内存位置更改值。

我没有阅读所有详细信息,但是这一部分跳出了错误的提示:

(metadata *)ptr - sizeof(metadata)

指针算术以类型为单位进行,而sizeof则以字节为单位进行测量。

因此,我怀疑您要说的是:

(metadata *)(((char*)ptr) - sizeof(metadata))

这也对您正在运行的计算机做出了一些假设,即,可能需要填充metadata以确保这些字段正确对齐。 如果sizeof(metadata)不是字长的倍数,则在许多体系结构上都会失败。 (但是x86会让它滑行,尽管它会带来性能成本和一些隐含的影响,例如原子操作无法在现场工作。

指针按值传递。 c中的任何值都按值传递。 因此,为了更改传递给该函数的指针,它应该metadata **first接收metadata **first

另外,你应该使用

metadata *strct = ((metadata *)ptr - 1);

因为指针算术是使用sizeof(* p)的倍数完成的。 所以这相当于

metadata *strct = ((metadata *)((char*)ptr - sizeof(metadata)));

暂无
暂无

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

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