加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正在调整C中的字符串危险

发布时间:2020-12-16 10:29:49 所属栏目:百科 来源:网络整理
导读:假设你有一个像这样的字符串: char* a="01234" 让 a = 0000,(a 1)= 0001,(a 2)= 0002,依此类推,如果在0007处已经为另一个变量分配了一些内存会发生什么,并且您尝试调整大小为a更大的尺寸(a =“0123456789”)?是否会移动到可以容纳更大字符串的新位置,或者0
假设你有一个像这样的字符串:

char* a="01234"

让& a = 0000,&(a 1)= 0001,&(a 2)= 0002,依此类推,如果在0007处已经为另一个变量分配了一些内存会发生什么,并且您尝试调整大小为a更大的尺寸(a =“0123456789”)?是否会移动到可以容纳更大字符串的新位置,或者0007中的数据是否会被覆盖?

编辑:

当他们说不允许调整C风格的字符串时,我不明白人们的意思.

char* a="01234"
cout << &a; //Prints 00FF1360
cout << a;  //Prints 01234
a="0123456789"
cout << &a; //Still prints 00FF1360
cout << a; //Prints "0123456789"

当我重新分配它时,指针a根本没有改变.似乎原始字符串“01234”刚刚被销毁,“0123456789”在同一位置取代了它.

没关系,我正在打印指针的位置而不是它指向的位置.作为一个附带问题,有没有人知道如何在不打印字符串的情况下打印字符指针的值?

解决方法

你写的不是C,绝对不允许.

正确的方式:

const char * a = "01234";  // pointer to array of six const chars.
char b[] = "01234";        // array of six chars

您只能读取值[0]到[5],但不能更改它们.您可以在0到5中更改i的值b [i],但一定不要将b [5]设置为除零之外的任何值.

对i大于5的[i]或b [i]的任何访问,读或写都是未定义的行为,几乎肯定是自杀.

在a的情况下,字符串文字通常存在于内存的全局只读部分中.另一方面,b只是本地范围内的一个自动数组,它被初始化为给定的六个字符(包括终端零).

相反,如果你已经通过一些神秘的方式来到一些有效的记忆区域的地址,你可能会造成各种各样的破坏:

char * evil = use_dastardly_exploit();
memcpy(evil,my_leet_shellcode,1024);

事实上,C和C让你可以自由地漫游你的进程的虚拟内存空间,但你可能会在任何时候被射击!

(对于你的第二个问题,写一个=“56789”;很好,但是它会设置一个指向不同的字符串而不是修改原始字符串(并且a仍然应该是const char *类型).)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读