#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字符数组,但是数组是作为字符串列表还是单个字符串工作?为什么?
在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字符字符串).