海湾合作委员会 4.4.4 c89
#define SIZE 5
char *names[SIZE] = {"peter", "lisa", "simon", "sarah", "julie"};
char *search_names[SIZE] = {0};
size_t i = 0;
for(i = 0; i < SIZE; i++ ) {
search_names[i] = names[i]++;
}
for(i = 0; i < SIZE; i++) {
printf("name to search for [ %s ]\n", search_names[i]);
}
我对这一行感到困惑 search_names[i] = names[i]++;
这是一个指向 char* 的指针数组。只是我的实验,我认为它应该是 &names[i]++
。因为我想得到那个位置的指针。所以有了 & 会让我得到指针指向的地址。
我想我也可以这样递增:(names[i]) + i
;
只是对那条线感到困惑。
最佳答案
names[i]
是一个指针,类型为 char*
。 &names[i]
是指向 names[i]
的指针,因此类型为 char**
。一些内存的图片:
names for each i, this is where names[i] *points*
|__________________ 0 1 2 3 4
| | | | | | |
| | v v v v v
[0 ][1 ][2 ][3 ][4 ] <gap> peter0lisa0simon0sarah0julie0
^
|_This is where &names[2] points, i.e. this is where names[2] *is*
name
是一个包含 5 个指针的数组,我用方括号及其索引描述了每个指针。加上一个空格,因为指针在我的机器上是 4 个字节。这是 names
初始化后的情况。右侧单独的内存块是一个字节序列,每个 0
表示一个 0/NUL 字节,而不是字符 0
。为字符串文字分配内存是实现(编译器、链接器和加载器一起工作)的责任——我假设您使用的所有字符串文字都将聚集在一起,尽管情况不一定如此。最后,数字 0 ... 4 表示 names
中的每个指针指向的位置。
因为您要分配给 char*
,所以您需要一个 char*
。或者从另一个角度来看,当(且仅当)指针本身具有相同的值时,指针指向同一事物。因此,如果您希望 search_names[i]
(这是一个指针)指向 names[i]
所指向的同一事物,那么 search_names[i] = names[i]
完全正确。
虽然我不知道做 names[i]++
的目的是什么。它修改指针 names[i]
。修改指针使其指向不同的东西。在这种情况下,您最终会得到 names[0]
指向“eter”,names[1]
指向“isa”,等等。
这是在您递增 names
中的每个指针后内存的样子:
names
|_____________ 0 1 2 3 4
| | | | | | |
v v v v v v v
[0][1][2][3][4] peter0lisa0simon0sarah0julie0
顺便说一句,您允许将字符串文字分配给char*
,但这并不意味着您应该。最好声明数组 const char *names[SIZE]
。修改编译器为字符串文字分配的内存是未定义的行为,使用 const char*
而不是 char*
有助于强制执行此操作。
关于c - 将指针分配给指向 char 的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3538508/