一维数组是作为字符串列表还是单个字符串工作?

Jay*_*noi -4 c

#include <stdio.h>
#include <string.h>

int main()
{
    int i;
    char a[10];
    for(i=0;i<10;i++)
    {
        scanf("%s",a);// >how this line is working in memory.
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我想知道字符串是如何保存在内存中的,因为我已经将它初始化为1D字符数组,但是数组是作为字符串列表还是单个字符串工作?为什么?

Joh*_*ode 5

在C中,一个是通过一个0值字符终止字符值的序列- IOW,字符串"Hello"被表示为字符序列'H','e','l','l','o',0.串存储在阵列char(或wchar_t对于宽字符串):

char str[] = "Hello";
Run Code Online (Sandbox Code Playgroud)

在内存中,str看起来像这样:

     +---+
str: |'H'| str[0]
     +---+
     |'e'| str[1]
     +---+
     |'l'| str[2]
     +---+
     |'l'| str[3]
     +---+
     |'o'| str[4]
     +---+
     | 0 | str[5]
     +---+
Run Code Online (Sandbox Code Playgroud)

可以在单个1D阵列中存储多个字符串,尽管几乎没有人这样做:

char strs[] = "foo\0bar";
Run Code Online (Sandbox Code Playgroud)

在记忆中:

      +---+
strs: |'f'| strs[0]
      +---+
      |'o'| strs[1]
      +---+
      |'o'| strs[2]
      +---+
      | 0 | strs[3]
      +---+
      |'b'| strs[4]
      +---+
      |'a'| strs[5]
      +---+
      |'r'| strs[6]
      +---+
      | 0 | strs[7]
      +---+
Run Code Online (Sandbox Code Playgroud)

字符串"foo"从开始存储strs[0],而字符串"bar"从开始存储strs[4].

通常,要存储字符串数组,您要么使用以下2D数组char:

char strs[][MAX_STR_LEN] = { "foo", "bar", "bletch" };
Run Code Online (Sandbox Code Playgroud)

或一个指针数组char:

char *strs[] = { "foo", "bar", "bletch" };
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,字符串的内容存储在strs数组中:

      +---+---+---+---+---+---+---+
strs: |'f'|'o'|'o'| 0 | ? | ? | ? |
      +---+---+---+---+---+---+---+
      |'b'|'a'|'r'| 0 | ? | ? | ? |
      +---+---+---+---+---+---+---+
      |'b'|'l'|'e'|'t'|'c'|'h'| 0 |
      +---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

在第二个中,每个strs[i] 指向不同的1D数组char:

      +---+                 +---+---+---+---+
strs: |   | strs[0] ------> |'f'|'o'|'o'| 0 |
      +---+                 +---+---+---+---+
      |   | strs[1] ----+
      +---+             |   +---+---+---+---+
      |   | strs[2] -+  +-> |'b'|'a'|'r'| 0 |
      +---+          |      +---+---+---+---+
                     |
                     |      +---+---+---+---+---+---+---+
                     +----> |'b'|'l'|'e'|'t'|'c'|'h'| 0 |
                            +---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

在您的代码中,a可以(并且通常用于)存储长度为9个字符的单个字符串(不包括0终止符).就像我说的,几乎没有人在一个1D数组中存储多个字符串,但它是可能的(在这种情况下,a可以存储2个4字符字符串).