Scanf和指针误解

Scanf和指针误解,c,pointers,scanf,C,Pointers,Scanf,看看这个: char* s; scanf("%s", s); 通常,s是一个存储框,其中包含指向另一个的地址,在本例中,该地址将是多个存储框中的第一个,其中包含标记字符串结尾的\0之前的字符。 *s将允许我们访问内存框,即字符串。 现在回到代码和scanf,我读了如下内容:获取用户输入,这是一个字符串,因此是%s,并将其分配给s。但这怎么可能呢?s是引用,所以不应该是scanf%s,而应该是*s吗?让我们举一个简单的例子: char c; scanf("%c", &c); 在本例中,

看看这个:

char* s;
scanf("%s", s);
通常,s是一个存储框,其中包含指向另一个的地址,在本例中,该地址将是多个存储框中的第一个,其中包含标记字符串结尾的\0之前的字符。 *s将允许我们访问内存框,即字符串。
现在回到代码和scanf,我读了如下内容:获取用户输入,这是一个字符串,因此是%s,并将其分配给s。但这怎么可能呢?s是引用,所以不应该是scanf%s,而应该是*s吗?

让我们举一个简单的例子:

char c;
scanf("%c", &c);
在本例中,如果要读取一个字符,则必须将该字符的地址传递给c,以便该方法知道将结果字符放在何处

让我们展开到一个字符串:

char *str;
scanf("%s", str);
在本例中,str是字符串开头的地址,因此您可以将其传递给scanf并期望读取该字符串

然而,这里有一个陷阱:str指向字符串的开头,但是这个字符串实际上并不存在,您必须创建它。像这样:

char str[80];
scanf("%s", &str[0]);
正如您在这里看到的,str现在是一个80个字符的字符串,您可以将该字符串开头的位置地址传递给scanf。但是,您必须祈祷读取的字符串不超过80个字符,否则该方法将尝试在字符串边界之外写入。您可以通过告诉scanf要读取多少字符来纠正此问题:

char str[80];
scanf("%79s", &str[0]);

实际上,代码是不正确的:它清楚地说明了应该为哪个格式说明符传递什么类型。此外,*s将返回一个单数字符,而不是字符串。char*s不会创建内存框。我想你的意思是,像char*s=malloc80;创建一个能够容纳80字节的内存盒,以后必须释放。最好使用短语指针。它是一个技术术语,描述了它的功能。它不是事物本身,它指向一个事物。您应该寻找一些scanf的示例。你在写作时的例子是不正确的。您需要一些内存来存储字符串。字符串是一个字符数。您需要一个指向该内存的指针。指针只能指向第一个指针。然后将指针传递给scanf,它将查找字符串并将其放入指针指向的内存中。@archaic在一个小缓冲区中读取许多字符是缓冲区溢出。缓冲区溢出会导致未定义的行为。未定义的行为正是如此。谢谢,最初我认为在scanf中,参数不是想要读取的变量的地址,而是变量本身。上一个例子应该正好做到这一点,我更新了它now@archaicC是传递值。您不能以任何方式将变量本身传递给任何函数,您所得到的只是变量值的副本。