Re:具有不同尺寸结构的结构数组 - 澄清

时间:2016-04-20 15:20:11

标签: c pointers struct realloc

关于其中一个已发布的解决方案,我有一个问题 - 此线程中已接受的解决方案: https://stackoverflow.com/a/4982586/5854333

我会留下评论,而不是开始一个新的问题线程,但我目前没有必要的经验。该程序确实按照承诺运行,与我打算实际实现的类似,但我仍然对其中是否存在微妙的内存问题感到困惑。

例如,在部分:

void addStringToHolder(stringHolder * holder, const char * string) {
    char ** newStrings = realloc(holder->strings, newStringCount * sizeof(char *));
    if (newStrings != NULL) {
        holder->strings = newStrings;
    }
}

(我们正在使用struct的这个函数)

typedef struct {
    int numberOfStrings;
    char ** strings;
}stringHolder;

可以在这个函数中修改双指针strings吗?我认为我们总是要传递一个指向我们想要修改的东西的指针,而不是事物本身。如果我们想修改双指针,我们不会传入三重指针吗?

当然我们也首先传入指向结构的指针,这样做是否有效?我想我迷失在所有这些指针中。一点清晰度会有所帮助。希望了解这个案例将使我了解其他人。

1 个答案:

答案 0 :(得分:1)

  

可以在此函数中修改双指针strings吗?

很快,是的。

详细说明:

C中的指针只是内存中的一个位置,当你将它传递给一个函数时,你只需告诉函数在哪里执行它的操作。

通过传入一个指向结构的指针,我们通过引用调用它的所有元素,因此我们可以修改它的任何元素,包括双指针strings

假设我们有一个指向结构stringHolder* h_ptr的指针,其中:

typedef struct {
   int numberOfStrings;
   char ** strings;
}stringHolder;

现在使用*取消引用指针,您可以访问每个级别:

h_ptr /*some adress in memory*/
*h_ptr /*the value stored in said adress (we know its a stringHolder)*/

使用语法x->y代替(*x).y以提高可读性

h_ptr->numberOfStrings /*the integer value stored in this struct*/
h_ptr->strings /*a pointer to an array of C string pointers*/
*(h_ptr->strings) /*the first "string" in said array, same as saying
                    a pointer to the first char in the first "string"*/
**(h_ptr->strings) /*the first char of the first "string"*/

使用指针算法,我们可以在任何我们想要的地方获取并修改值(只要我们保持空终止字符串的C约定)

*(h_ptr->strings + 1) /*the second "string" in strings array*/
*(*(h_ptr->strings + 2) + 4) /*the fifth char in the third "string"*/

等等。