正在调整C中的字符串危险
假设你有一个像这样的字符串:
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 *类型).) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |