【问题标题】:Re: Struct Array with Varying Size Structs--Clarification回复:具有不同大小结构的结构数组——澄清
【发布时间】:2016-08-13 09:34:00
【问题描述】:

我对已发布的解决方案之一有疑问 - 此线程上已接受的解决方案: 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;
    }
}

(我们正在使用结构体处理这个函数)

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

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

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

【问题讨论】:

  • 您通过将指针传递给结构来告诉函数:嘿,内存中的那个地方有一些东西,去那里弄乱你想要的东西。确实如此。
  • 只是为了确定,const char * 的第二个参数 string 是否应该未被使用?它正在被传入,但我没有看到变量 string 的任何文字用法。
  • @EugeneSh。因此,传入指向结构的指针允许我们修改结构的任何元素。好像有道理,谢谢现在,我们为什么要传递一个指向结构的双指针,就像在 void createNewStringHolder(stringHolder ** holder) { (*holder) = malloc(sizeof(stringHolder)); } 中一样?大概我们正在改变分配给结构的内存大小,但是当它在主函数中声明时,它不是已经从它的定义中获得了这个大小吗?这有什么变化?
  • @8protons 我只添加了我不理解的部分功能,以使我的问题更具可读性。您可以在链接中看到更完整的上下文。
  • 它是一个双指针,因为它旨在指向多个字符串。每个字符串由一个指针指向,而一堆字符串由一堆指针指向,所以你需要一个指向指针的指针。

标签: c pointers struct realloc


【解决方案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"*/

等等。

【讨论】:

  • 感谢您的解释!我认为这里的关键答案是 Eugene Sh。指出(哈!)。通过传入指向结构的指针,可以修改结构的所有内容。我了解这些示例中的指针是如何工作的——我主要担心的是,由于我们将 realloc 与双指针一起使用,双指针有时需要更改位置,所以我想确保它确实是通过引用而不是被调用比值,以便在必要时可以对其进行修改。尤金·肖。确认它是,因为我们传递了一个指向结构的指针。再次感谢!
猜你喜欢
  • 2011-06-26
  • 2011-11-07
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多