C指针-是数组的结构

C指针-是数组的结构,c,pointers,C,Pointers,我已经在这段代码上工作了几个小时了,我不明白为什么printf只是打印垃圾,我对stackoverflow是全新的,对C也是相当陌生的,所以请原谅我在这篇文章中的任何错误。我研究了指向数组结构的指针,但没有找到任何有用的东西 typedef struct my { int x; int y; } My; My * main2(void); void show(void) { My * m = main2(); printf("%u\n", m);

我已经在这段代码上工作了几个小时了,我不明白为什么printf只是打印垃圾,我对stackoverflow是全新的,对C也是相当陌生的,所以请原谅我在这篇文章中的任何错误。我研究了指向数组结构的指针,但没有找到任何有用的东西

typedef struct my
{
    int x;
    int y;
} My;

My * main2(void);

void show(void)
{
    My * m = main2();

    printf("%u\n", m);

    printf("%u\n", m);
    printf("%d\n", m->x);
    printf("%d\n", m->y);
    m++;
    printf("%u\n", m);
    printf("%d\n", m->x);
    printf("%d\n", m->y);
    m++;
    printf("%u\n", m);
    printf("%d\n", m->x);
    printf("%d\n", m->y);
}

My * main2(void)
{
    My j[3];
    j[0].x = 2;
    j[0].y = 4;

    j[1].x = 3;
    j[1].y = 5;

    j[2].x = 7;
    j[2].y = 9;

    printf("%u\n", j);
    return j;
}

int main()
{
    show();

    return 0;
}

函数中定义的变量仅具有该函数的生命周期。一旦函数返回,变量本质上就不存在了

现在,如果您返回一个指向这样一个变量(或像您一样指向数组的第一个元素)的指针,并且该数据不再存在,那么当您尝试使用该指针时,您将得到一个指针

解决此类问题的一种方法是将数组(或指向其第一个元素的指针)作为参数传递给函数:

void main2(My *j)
{
    j[0].x = 2;
    // And so on...
}
要将数组传递给函数,请记住,数组在预期使用指针的上下文中使用时,会衰减为指向其第一个元素的指针

这意味着您可以像传递任何其他变量一样传递它:

My arr[3];
main2(arr);  // equal to main2(&arr[0]);

另一方面,使用的指针打印格式是
“%p”
。指针也需要铸造
void*

printf("%p\n", (void *) j);
为什么printf只是打印垃圾?这是因为你在这里返回一个局部变量的地址

My j[3];
...
...
return j; /* j is a local array, its scope is within this this function not outside */
你的编译器可能会这样警告你

函数返回局部变量的地址[-Werror=返回局部地址]

为了克服这个问题,您可以创建动态数组并返回它

另外,在打印
m
哪个结构指针时,请使用
%p
而不是
%u
格式说明符。例如

printf("%p\n", (void*)m);

好的,我得到了答案,我忘记了这个非常重要的问题,函数返回后,函数中的所有内容都“消失了”,谢谢两位帮助回答这个问题的人:)


您正在返回一个局部变量的地址。哪一部分让您感到困惑?来自
main2()
j
的输出或来自
show()
main2()
的返回值的输出?是的,但是如果我的结构是数组,我如何通过传递指向我的结构地址的指针来获得该变量的值呢?show函数的输出是垃圾数据,这让我很困惑。
typedef struct my
{
    int x;
    int y;
} My;

void getData(My * pos)
{
    printf("%d", pos->x);
    printf("%d", pos->y);
    pos++;
    printf("%d", pos->x);
    printf("%d", pos->y);
}

int main()
{
    My x[2];

    x[0].x = 3;
    x[0].y = 4;

    x[1].x = 5;
    x[1].y = 6;

    getData(x);

    return 0;
}