【发布时间】:2015-02-07 00:56:44
【问题描述】:
假设我有这个功能:
void f(char *s) {
s[0] = 'x';
}
此功能有时会导致错误,有时不会。例如,
char *s = "test";
f(s); // Error
char t[] = "test";
f(t); // Success
在f函数内部,是否可以先判断s[0] = 'x';会不会出错?
【问题讨论】:
-
我不相信有任何便携的方法可以做到这一点。不过,可能会有一些特定于平台的技术。
-
如果有人选择以表现出未定义行为的方式使用您的函数,并且您的函数有据可查,那就是他们。
-
尝试修改
const对象会导致未定义的行为。实际上,这意味着你不能编写一个测试这个的函数。但是,您可以通过严格指定哪些对象是const来获得编译时诊断,因此您永远不会尝试修改它们或将const对象传递给修改它的函数。 -
@EOF:字符串文字不是
const对象。但是由于特殊情况规则,修改字符串文字仍然具有未定义的行为。 -
@KeithThompson:是的。它实际上具有
const语义。