gpt4 book ai didi

c - 定义指向静态字符串的指针

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:53 25 4
gpt4 key购买 nike

here据说对于全局变量有以下形式:

(1) const char *a = "...";

不如:

(2) const char a[] = "..."

为什么?我一直认为 (1) 更好,因为 (2) 实际上复制了我们分配给它的字符串,而 (1) 仅指向它。

最佳答案

livejournal 链接的论点是 (1) 通过创建单独的指针变量和指针变量可能被覆盖的安全漏洞引入了不必要的间接级别。假设有以下两个声明:

char  *p = "This is a test";
char s[] = "This is a test";

假设这些声明在文件范围内,因此 ps 都具有静态范围。

这是一个假设的内存映射,显示了所有内容的布局:

                     0x00  0x01  0x02  0x03        0x00008000: 'T'   'h'   'i'   's'        0x00008004: ' '   'i'   's'   ' '        0x00008008: 'a'   ' '   't'   'e'        0x0000800C: 's'   't'    0    ...        ...     p: 0x00010000: 0x00  0x00  0x80  0x00     s: 0x00010004: 'T'   'h'   'i'   's'        0x00010008: ' '   'i'   's'   ' '        0x0001000C: 'a'   ' '   't'   'e'        0x00010010: 's'   't'    0    ...

链接中的论点如下:

  1. 一个附加变量 -- p 是一个与它所引用的字符串不同的对象;它本身不包含字符串值,而 s 包含;
  2. 更多的攻击点,变量是可写的——可以重新分配p指向其他地方(可能指向包含恶意代码的段),而你不能重新分配s
  3. 额外的搬迁 -- 不确定这是指什么(对于我所做的工作,我从来没有真正担心过机器级别的性能,所以我不是熟悉所有术语);
  4. 获取字符串地址需要一次内存加载,而访问字符串本身需要两次内存加载——如果您通过 p 读取字符串,首先您必须加载 0x00010000 的内容以获取字符串地址 (0x00008000),然后您必须加载 0x00008000 的内容以获取字符串值本身。如果您经常这样做,很多,那么使用字符数组并删除一个间接级别可能会显着提高性能。

总而言之,您可以用少量内存换取更高的速度和安全性。当然,这假设了特定的操作环境,可能并不普遍适用。

关于c - 定义指向静态字符串的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1770062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com