用scanf读取一个string

我有点困惑。 我的印象是用scanf()读取Cstring的正确方法是沿着

(不要介意可能的缓冲区溢出,这只是一个简单的例子)

char string[256]; scanf( "%s" , string ); 

但是,以下似乎也工作,

 scanf( "%s" , &string ); 

这只是我的编译器(gcc),纯粹的运气,还是别的什么?

提前致谢

一个数组“decay”成指向其第一个元素的指针,所以scanf("%s", string)等同于scanf("%s", &string[0]) 。 另一方面, scanf("%s", &string)传递一个指向char[256]的指针,但它指向相同的地方。

然后scanf ,当处理其参数列表的尾部时,将尝试拉出一个char * 。 这是正确的事情,当你已经传递了string&string[0] ,但是当你传入&string你取决于语言标准不能保证的东西,即指针&string&string[0] – 指向不同types和大小的对象的指针在同一个地方开始 – 都以相同的方式表示。

我不相信我曾经遇到过一个不行的系统,实际上你可能是安全的。 无论如何,这是错误的,它可能会在一些平台上失败。 (假设的例子:一个包含每个指针的types信息的“debugging”实现,我认为符号“Lisp Machines”上的C实现是这样的)。

我认为这下面是准确的,它可能会有所帮助。 如果发现任何错误,请随时纠正。 我是新来的

 char str[] 
  1. chartypes的值的数组,在内存中有自己的地址
  2. chartypes的值的数组,在内存中拥有自己的地址,与数组中的元素一样多
  3. 包括终止空字符'\0' &str&str[0]str ,所有三个表示内存中的相同位置,它是数组str的第一个元素的地址

    char * strPtr =&str [0]; //声明和初始化

或者,您可以将其分成两部分:

 char *strPtr; strPtr = &str[0]; 
  1. strPtr是一个指向char的指针
  2. strPtr指向数组str
  3. strPtr是一个在内存中拥有自己地址的variables
  4. strPtr是一个存储address &str[0]值的variables,
  5. strPtr在内存中的自己的地址不同于它存储的内存地址(内存中的地址又称为&str [0])
  6. &strPtr表示strPtr本身的地址

我认为你可以声明一个指针指针为:

 char **vPtr = &strPtr; 

用strPtr指针的地址声明并初始化

或者你可以分成两部分:

 char **vPtr; *vPtr = &strPtr 
  1. *vPtr指向strPtr指针
  2. *vPtr是一个在内存中拥有自己地址的variables
  3. *vPtr是一个存储address&strPtr值的variables
  4. 最后的评论:你不能做str++str地址是一个const ,但是你可以做strPtr++