我期望在以下代码中得到错误,但我没有。我没有使用&标志。我也在编辑chars的数组。
#include <stdio.h>
int main()
{
char name[10] ="yasser";
printf("%s\n",name);
// there is no error ,
// trying to edit array of chars,
// also did not use & sign.
scanf("%s",name);
// did not use strcpy function also.
printf("%s\n",name);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
听起来你有几个问题:
scanf("%s", name)应该给出错误,因为%s需要一个指针并且name是一个数组?但正如其他人所解释的,当您在这样的表达式中使用数组时,您总是(自动)得到一个指向数组第一个元素的指针,就像您编写了scanf("%s", &name[0]).scanf写入应该会给出name错误,因为name是用字符串常量初始化的?嗯,这就是它的初始化方式,但name它实际上是一个数组,因此您可以自由地写入它(当然,只要写入的字符不超过 10 个)。请参阅下面的更多内容。strcpy?没有什么真正的惊喜。再次,scanf只是写入您的数组。让我们仔细看看你写了什么和没有写什么。
当您声明并初始化 的数组时char,与声明并初始化指向 的指针时完全不同char。当你写下
char name[10] = "yasser";
Run Code Online (Sandbox Code Playgroud)
编译器为你做的事情有点像你写的
char name[10];
strcpy(name, "yasser");
Run Code Online (Sandbox Code Playgroud)
也就是说,编译器安排使用字符串常量中的字符来初始化数组的内容,但您得到的是一个普通的可写数组(而不是不可写的常量字符串常量)。
另一方面,如果你写了
char *namep = "yasser";
scanf("%s", namep);
Run Code Online (Sandbox Code Playgroud)
你会遇到你所期望的问题。在这种情况下,namep是一个指针,而不是一个数组。它被初始化为指向"yasser"不可写的字符串常量。当scanf尝试写入该内存时,您可能会收到错误。
我希望在下面的代码中遇到错误,但是我没有,我没有使用&签名。
scanf("%s",name);
Run Code Online (Sandbox Code Playgroud)
完全name可以,因为字符数组的地址已经存在。
| 归档时间: |
|
| 查看次数: |
22391 次 |
| 最近记录: |