为什么指针的指针的值具有未定义的行为?
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]);
}
这是我的代码
#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]);
}