消息关闭
    暂无新消息!
下面做法,编译运行结果是正常的,但,直接把内部变量的地址传递出去,在外面访问是不是不是安全?
我理解为,函数内部地址空间的内容,出了函数后就不保证不被人修改了。这样虽然能访问到,但值很可能不是期望的?


#include <stdio.h>
int foo(const char *** s)
{
    const char* s1[]={"abc","efg"};
    *s=&s1;
    return 0;
}

int main(int argc, char ** argv)
{
    const char **s;
    foo(&s);
    printf(" %s %s ", s[0], s[1]); //输出结果: abc efg 
}

7个回答

︿ 3

#if 1

void get_ptr(char ***save)
{
//argv数组中的每个元素都是指向rodata段的指针,rodata段中数据的生命周期等同程序生命周期
char *argv[] = {"hello", "C", "world"};

*save = argv;//argv本身就是字符指针数组中元素的首地址,直接赋给二级字符指针即可
}

int main(void)
{
char **save = NULL;

get_ptr(&save);

//完全不必担心save数组中的元素出了get_ptr函数被释放,除非你的程序走到头了.
printf("%s\t%s\t%s\n", save[0], save[1], save[2]);

return 0;
}

#endif
︿ 1
s1数组本身是局部变量,函数结束后就销毁了,结果正确只能说明运气好

字符串"abc"是在常量区,可以从函数返回指向常量字符串的指针

要限制函数外修改,可以限定指针类型,让指针指向的字符串为常量
︿ 1
请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢?
︿ 0
在整个程序初始化时分配该程序将要用到的所有空间;
在整个程序退出前释放该程序在初始化时分配的所有空间。
︿ 0
这个世界上根本就没有那么多“不确定”。
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
︿ 0
foo的操作获得的s1的地址是没有意义的,得到的结果也是未定义的。因为s1是在foo函数栈上申请的局部变量指针数组,foo调用结束后,s1指针数组就会被释放,那么你得到的s1的地址自然就没有意义了,即使你得到的字符串是对的,因为可能foo释放之后的空间尚未被新的函数申请。所以,这个是未定义的。