|
|
1
40
第一个例子:有些安全
特别是,此功能不被视为
因为可重入函数不能,
你应该考虑一下:
1) 如果您有权访问代码,请修改
|
|
|
2
10
这取决于你所说的安全。我可以立即看到几个问题:
为了解释第二点,考虑一下:
如果你这样称呼它:
…将要打印什么?
|
|
3
10
|
|
|
4
8
基本上,是的,它是安全的,因为它是静态的,所以该值将无限期地持续。 从某种意义上讲,您返回的是指向变量数据的常量指针,而不是指向常量数据的变量指针,这是不安全的。最好不允许调用函数修改数据:
在所示的简单示例中,几乎没有必要担心缓冲区溢出,尽管我的代码版本确实担心,并确保空终止。另一种选择是使用
TR24731
作用
更重要的是,这两个变量都返回一个指向常量数据的(变量)指针,因此用户不应该修改字符串和(可能)践踏数组范围之外的内容。(正如@strager在评论中指出的,返回一个
文本返回的一个优点是,无写承诺通常可以由编译器和操作系统强制执行。字符串将被放置在程序的文本(代码)段中,如果用户试图修改返回值所指向的数据,操作系统将生成错误(Unix上的段冲突)。
|
|
5
3
是的,非常安全。局部静态的生命周期是整个程序在C中执行的生命周期。因此,您可以返回指向它的指针,因为即使在函数返回后,数组仍将处于活动状态,并且返回的指针可以有效地取消引用。 |
|
|
6
1
它非常有用,因为您可以将函数直接用作printf参数。 但是,正如前面提到的,在单个调用中对函数的多次调用将导致问题,因为函数使用相同的存储,并且调用两次将覆盖返回的字符串。但是我测试了这段代码,它似乎起到了作用——您可以安全地调用函数,其中givemestring在最多MAX_调用次数下使用,并且它将正常工作。
唯一的问题是线程安全,但这可以通过线程局部变量(gcc的_线程关键字)来解决 |
|
7
0
是的,这经常用于返回某些查找的文本部分,即将某些错误号转换为人性化字符串。 在以下情况下这样做是明智的:
如果
... 这也没关系,不过有些死气沉沉的编译器可能会希望您使用它。 用这种方式看琴弦,不要还书:) |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |