Cra*_*rz5 15 c++ const constants scanf
我有相当于以下代码:
const int* const n = new int;
printf("input: ");
scanf("%d", n);
delete n;
Run Code Online (Sandbox Code Playgroud)
现在,因为n是指向CONSTANT整数的指针,所以这不应该工作(我期待编译器错误).但是,这似乎可以正常工作,甚至可以将输入值存储到*n中.
我想知道,为什么这不会给我一个错误; 它为什么有效?扫描不能改变*n的值吗?
pca*_*ter 23
scanf的原型是:
int scanf ( const char * format, ... );
Run Code Online (Sandbox Code Playgroud)
省略号意味着它需要变量参数.C(和C++)无法检查这些参数的有效性.这就是为什么如果你传递double的地址或者甚至是double变量本身你都不会得到错误的原因.程序员可以验证是否传递了正确的参数.
scanf旁边没有类型安全,它很乐意做你告诉它的.这是因为变量参数列表在C中实现的方式.他们希望类型是你告诉它的类型.
因此,如果您提供scanf不匹配的转换说明符,您将调用在运行时发生的未定义行为.类似地,编译器可能无法判断传递的指针是否为类型const type* const.一个好的编译器可以提供诊断,如果它发现了一些可疑的东西,但绝不需要这样做.
由于大多数未定义行为的情况都发生在运行时,因此程序员通常有责任了解各种形式的未定义行为并避免它们.
| 归档时间: |
|
| 查看次数: |
2454 次 |
| 最近记录: |