首页 > 解决方案 > C 指针 - 作为数组的结构

问题描述

我已经在这段代码上工作了几个小时,对为什么 printf 只打印垃圾感到困惑,我是堆栈溢出的新手,对 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;
}

标签: cpointers

解决方案


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

现在,如果你返回一个指向这样一个变量的指针(或者像你做的那样指向数组的第一个元素)并且该数据不再存在,那么当你尝试使用指针时你会得到未定义的行为。

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

void main2(My *j)
{
    j[0].x = 2;
    // And so on...
}

并且要将数组传递给函数,请记住,当在需要指针的上下文中使用数组时,数组会衰减为指向其第一个元素的指针。

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

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

另一方面,打印指针的格式printf"%p". 指针也需要强制转换void *

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

推荐阅读