为什么指针的指针的值具有未定义的行为?

Why does the value of a pointer of a pointer have undefined behaviour?

这是我的代码

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

char ** func()
{
    char list[2][20] = {"a140","3.14"};
    char * l[2] = {list[0], list[1]};
    char ** point = l;
    return point;
}

int main()
{
    char ** pointers;
    pointers = func();
    printf("%d", *pointers[0]);
}

我在这里尝试调用一个函数,该函数 returns 指向一个指针数组的指针,该指针数组指向一个包含字符的数组的值。

但是出了点问题,当我 运行 这段代码输出时:

97

返回的值是指向局部变量的指针,特别是 &l[0]。在函数returns之后,这个变量的生命周期结束。因此,当您尝试取消引用返回的指针时,您是在尝试在其生命周期结束后访问一个对象。这会触发 undefined behavior.

您的函数需要为要返回的字符串数组动态分配内存。

const char **func()
{
    const char **l = malloc(2 * sizeof *l);
    l[0] = "a140";
    l[1] = "3.14";
    return l;
}

另请注意,输出将保持不变,因为您打印的是第一个字符串的第一个字符的 ASCII 值。如果要打印整个字符串,请不要取消引用 pointers[0] 并使用 %s 格式说明符:

printf("%s", pointers[0]);

你也可以


char ** func(void)
{
    static char *list[] = {"a140","3.14"};
    return list;
}

/* LOL everything is list */
typedef struct
{
    char *list[2];
}list;

list func(void)
{
    list list = {{"a140","3.14"}};
    return list;
}

int main(void)
{
    char **list = (func()).list;

    printf("%s %s\n", list[0], list[1]);
}

https://godbolt.org/z/hhjK8G7TP