【问题标题】:C Passing struct by referenceC 通过引用传递结构
【发布时间】:2019-01-29 01:22:25
【问题描述】:

我有以下我想通过引用传递的结构

typedef struct payload {
    char *payload;
    uint64_t payloadSize;
} Payload;

以下是该方法的实现。

void parsePayload(const char *originalPayload, const int payloadSize, Payload *source) {    
    source->payloadLength = 5;
    source->payload = malloc(5 * sizeof(char));
    memcpy((void *)source->payload, originalPayload, 5);
}

这里有主函数,我想通过修改指针内容的方法传递分配的对象

int main() {
    Payload *sourcePayload = malloc(sizeof(Payload));
    parsePayload("some random char", 16, &sourcePayload);
    Log("%d", sourcePayload->payloadSize);
}

但是,当我记录 payloadSize 时,输出似乎有问题。请指出我做错了什么。

提前致谢!

【问题讨论】:

  • 你的编译器警告肯定已经告诉你错误了吗?
  • 您声明了Payload *sourcePayload,所以sourcePayload 已经是Payload * 类型——为什么要使用它的地址? (仅当传递Payload ** 以允许在函数内realloc 而不返回值时才需要)使用 gcc/clang 将-Wall -Wextra -pedantic(至少)添加到您的编译器字符串,对于 VS 添加/W3,并且不接受代码直到它在没有警告的情况下编译。让编译器帮助您编写更好的代码。 (它在日志运行中节省了大量时间)
  • 附带说明,C 仅具有传递值。 c-faq.com/ptrs/passbyref.html
  • 通过转换 memcpy 的参数来取消不转换 malloc 的布朗尼点

标签: c pass-by-reference


【解决方案1】:

sourcePayload 的类型为 Payload *,因此 &sourcePayload 的类型为 Payload **。这与函数所期望的不兼容,您的编译器应该警告您这一点。

由于sourcePayload已经有一个匹配函数参数的类型,直接传递就行了。

parsePayload("some random char", 16, sourcePayload);

另外,请务必在main 的末尾加上free(sourcePayload->payload) 然后free(sourcePayload)

【讨论】:

  • 作为一个后续问题,如果我释放(sourcePayload),我是否也应该在此之前释放(sourcePayload->payload)?
  • @Dillon 是的,因为它指向 malloc 的内存,你应该先free(sourcePayload->payload) 然后free(sourcePayload);
猜你喜欢
  • 2013-05-12
  • 2011-02-02
  • 1970-01-01
  • 2015-11-14
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多