c - 将指针分配给指向 char 的指针数组

标签 c pointers

海湾合作委员会 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/

相关文章:

c - 函数调用前的堆栈返回地址 : To which segment points the return address?

c - 将C中的字符串拆分为单独的部分

C++ 指针语法 ->

c - 在 C 中的结构中调整数组的大小

c - 对于此示例,我的 C 中双指针/指针的逻辑是否正确

c - 系统内存是什么意思

c - 使用指针进行快速排序

c - 在字符串文字中使用哪些字符是合法的?

重访 C 指针

c - 错误 : Expected expression before structure