我对某些事情有点困惑.我的印象是,读取C字符串的正确方法与之scanf()相符
(不要介意可能的缓冲区溢出,这只是一个简单的例子)
char string[256];
scanf( "%s" , string );
Run Code Online (Sandbox Code Playgroud)
但是,以下似乎也有效,
scanf( "%s" , &string );
Run Code Online (Sandbox Code Playgroud)
这只是我的编译器(gcc),纯粹的运气还是别的什么?
Gar*_*han 131
数组"衰减"为指向其第一个元素的指针,因此scanf("%s", string)相当于scanf("%s", &string[0]).另一方面,scanf("%s", &string)传递一个指针指向char[256],但它指向同一个地方.
然后scanf,当处理其参数列表的尾部时,将尝试拉出一个char *.当你传入string或者传入时,这是正确的事情&string[0],但是当你传入时,&string你依赖于语言标准不能保证的东西,即指针&string和&string[0]- 指向不同类型和大小的对象的指针从同一个地方开始 - 以同样的方式表示.
我不相信我曾经遇到过一个不起作用的系统,而且在实践中你可能很安全.尽管如此,这是错误的,它可能会在某些平台上失败.(假设的例子:一个"调试"实现,包括每个指针的类型信息.我认为 Symbolics"Lisp Machines"上的C实现做了类似的事情.)
| 归档时间: |
|
| 查看次数: |
501489 次 |
| 最近记录: |