在c / c ++中,有些人使用c样式的字符串,如:
char *str = "This is a c-styled string";
我的问题是这样安全吗?我看到它的方式是他们创建了一个char指针,指向const数组的字符的第一个字母,但不能其他一些东西,例如另一个变量覆盖内存中char数组的一部分?因此导致str在逻辑上无效?
答案 0 :(得分:7)
这些天字符串常量被放在二进制文件的只读部分中。如果您尝试写入只读部分中的地址,CPU的内存管理单元将导致故障,您的应用程序将获得访问冲突或分段错误或某些其他依赖于操作系统的行为。
此外,如果将字符串常量的类型声明为非常量,编译器会发出警告。
答案 1 :(得分:6)
但是不能用其他东西例如另一个变量覆盖内存中char数组的一部分吗?
他们一定不能这样做。原因是你的C字符串文字是一个常量,正确地说它应该被声明为一个:
char const* str = "This is a c-styled string";
您的(非常规)代码仅允许与传统C代码兼容。尝试修改数据会导致未定义的行为。
答案 2 :(得分:3)
事情和你做的一样安全。您可以像在字符串中一样轻松覆盖堆栈上的整数。事实上,你的问题中的内容更安全(在某些系统中),因为它可能放在只读内存部分。
如果人们不知道他们在做什么,他们就不应该使用C.就像他们不应该在没有经过适当培训的情况下使用电锯一样。 C的整个存在理由是一种系统编程语言。它为您提供了完成所需功能的全部功能。随着权力的到来,责任也在增加。
答案 3 :(得分:1)
这是不安全的。但是C / C ++中的任何其他东西也是如此。您可以轻松覆盖其他对象使用的内存部分。
答案 4 :(得分:1)
它们与编程实践一样安全。只要您知道如何正确使用它们,它们就非常安全。对于那些编程风格让人想起瓷器店里的大象的人来说,这样的字符串可能并不安全。但是,对于整个C / C ++语言,可以说同样的事情。
您的原始单行声明示例已经存在不安全的样式问题。在C和C ++中,字符串文字是不可修改的左值。创建指向这些文字的[long-lived]非const指针并不是一个好主意。通常情况下,它应如下所示
const char *str = "This is a c-styled string";
注意额外的'const'。
(这个特殊规则不能总是在C中遵循,但通常只需要在一些控制良好的本地化惯用代码中违反它。)
答案 5 :(得分:0)
实际上不要这样做:
int *foo = 0x1234;
byte[] bytes = (byte[]) foo;
bytes[0] = 0x56;
printf("%d\n", *foo);
也就是说,任何指针在被滥用时都是危险的。
答案 6 :(得分:0)
取决于你所说的“安全”。
它们在本质上并不比C / C ++中任何其他指针使用更安全。指针通常要求你对记忆非常小心。