回复:具有可变大小结构的结构数组——说明

Re: Struct Array with Varying Size Structs--Clarification

我对已发布的其中一种解决方案有疑问——该线程上已接受的解决方案: .

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

例如,在部分中:

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

(我们在这个函数中使用结构)

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

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

当然,我们也首先传递了一个指向结构的指针,这样可以吗?我想我迷失在所有这些指针中。稍微清楚一点会有所帮助。希望理解这个案例能让我理解其他的。

Can the double pointer strings really be modified in this function?

很快,是的。

详细说明:

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"*/

等等。