【问题标题】:Passing a pointer by reference crashes the programme通过引用传递指针会使程序崩溃
【发布时间】:2020-11-03 20:38:44
【问题描述】:

我正在尝试创建一个在对象初始化期间分配内存的类(使用init 过程)。程序在运行时以segfault 崩溃。正如我所发现的,这是因为我通过引用**sequence 传递了指针。即使我在过程调用之前分配内存,也会发生段错误。一旦我将指针作为纯值*sequence 传递,故障就消失了。我不能通过引用传递指针吗?

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

typedef struct
{
    int *sequence;
} set;

void init(int **sequence, unsigned amount, ...)
{    
    va_list args;
    va_start(args, amount);

    *sequence = malloc(amount * sizeof(**sequence));

    for (unsigned i = 0; i < amount; i++)
        *sequence[i] = va_arg(args, int);
    
    va_end(args);
}

int main(void)
{
    set x;   
    init(&x.sequence, 5, 0, 1, 2, 3, 4);

    for (char i = 0; i < 5; i++)
        printf("%u\t", x.sequence[i]);
}

【问题讨论】:

  • *sequence[i] = va_arg(args, int); --> 应该是(*sequence)[i] = va_arg(args, int);
  • @AlexLop。惭愧我,谢谢。没想到问题是优先级引起的

标签: c pointers segmentation-fault


【解决方案1】:

改变这个:

*sequence[i] = va_arg(args, int);

到这里:

(*sequence)[i] = va_arg(args, int);

[] 运算符比* 绑定得更紧密,因此需要括号来获得所需的分组。

【讨论】:

  • 没想到会这样。当我写 *var[] 时,它通常会起作用
  • 如果没有括号,这种特殊情况永远不会起作用(除非i 为零)。不同之处在于您有一个整数数组而不是指针数组。这意味着您需要先将其降至 int *,然后才能尝试对其进行索引。
  • 感到很惭愧 :c 无论如何,谢谢,等待接受
  • 这是一个很容易犯的错误 - 你的陪伴很好!
猜你喜欢
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2014-07-27
  • 2023-03-03
  • 2014-05-06
  • 1970-01-01
  • 2021-02-28
相关资源
最近更新 更多