【问题标题】:How to access pointer variables defined in a structure that is passed to a function as a pointer? [duplicate]如何访问作为指针传递给函数的结构中定义的指针变量? [复制]
【发布时间】:2019-09-09 08:51:58
【问题描述】:

我将结构传递给函数。该结构包含一个指针变量。结构本身作为指针变量传递给函数。我无法使用访问数组的下标样式(var [0])访问结构的指针变量成员(在函数内部)。代码可以编译,但在执行 .o 文件时出现分段错误。错误出在函数代码的第一行。我无法访问结构内的指针变量。

当不涉及函数时,我可以使用点运算符轻松访问此指针变量。例如,看最后的工作代码。

有问题的代码:

#include<stdio.h>

struct prog
    {
        double* var;
        char* name;
        int arr[]; 
    };

typedef struct prog p;

void fun(p *inp);

int main()
{
    p in;

    p *inptr = &in;

    in.arr[1] = 32;

    fun(inptr);


    printf("Value var is: %f\n", in.var[0]);
    printf("Value arr[0] is: %d\n", in.arr[0]);
    printf("Value arr[1] is: %d\n", in.arr[1]);
    printf("Name of prog is: %s\n", in.name);
    return 0;
}

//Function
void fun(p *inp)
{
    (*inp).var[0] = 4.5;
    //inp->var[0] = 4.5;
    inp->arr[0] = 11;
    inp->arr[1] = 55;
    inp->name = "User";
}

工作代码:

#include<stdio.h>

struct prog
    {
        double* var;
        char* name;
        int arr[]; 
    };

void main()
{
    struct prog p;
    p.var[0] = 3.7;
    p.name = "User";
    p.arr[0] = 100;
    p.arr[1] = 30;  

    printf("Value var is: %f\n", p.var[0]);
    printf("size of prog is: %d bytes \n", sizeof(p));  
    printf("Value at arr[0] is: %d\n", p.arr[0]);
    printf("Value at arr[1] is: %d\n", p.arr[1]);
    printf("Name of prog is: %s\n", p.name);
}

运行 'gdb' 说“程序收到信号 SIGSEGV,分段错误。 0x00005555555551d3 in fun (in=0x7ffffffffe200) at strct-fun.c:35 35 (*inp).var[0] = 4.5;"

【问题讨论】:

  • 您没有为任何指针或数组分配内存。
  • @hacks :如果是这样,那么为什么标记的“工作代码”应该起作用?我正在尝试将其扩展到函数。您可以将它作为 C 代码运行吗?感谢您的回复方式。

标签: c function pointers struct


【解决方案1】:
in.arr[1] = 32;

你不能使用静态内存来做到这一点,如果你想要一个灵活的数组成员,你需要malloc:

p *in = malloc(sizeof *in + sizeof(int) * number_of_arr_elements);

请注意,灵活数组仅适用于最后一个成员。

其他成员也需要空间:varname

p->var = malloc(sizeof(double) * number_of_var_elements);
p->name = malloc(max_length_of_name + 1); /* +1 for the trailing \0 */

【讨论】:

  • 感谢您的回复。但是,我尝试注释掉有问题的行(前两行 fun() 和 main 中的第一个打印语句)。结果证明代码确实可以正常工作,即 in.arr[1] = 32; 没有问题你能尝试将它作为 C 代码运行吗?
  • 你试过我的方法了吗?它应该工作
  • 谢谢。您将 malloc 用于“var”和“name”的解决方案有效。我无法获得 *in 工作的 malloc。我有一个后续问题需要我显示代码,但我无法将其粘贴到此处。我要问一个新问题。谢谢。
猜你喜欢
  • 2021-06-04
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 2014-04-16
相关资源
最近更新 更多