Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关于:具有不同大小结构的结构数组——澄清_C_Pointers_Struct_Realloc - Fatal编程技术网

C 关于:具有不同大小结构的结构数组——澄清

C 关于:具有不同大小结构的结构数组——澄清,c,pointers,struct,realloc,C,Pointers,Struct,Realloc,我有一个关于发布的解决方案之一的问题——这个帖子上被接受的解决方案: 我会留下一个评论,而不是开始一个新的问题线程,但我目前没有必要的经验。该程序确实按照承诺运行,与我打算实际实现的程序类似,但我仍然不清楚其中是否存在细微的内存问题 例如,在以下部分: void addStringToHolder(stringHolder * holder, const char * string) { char ** newStrings = realloc(holder->strings,

我有一个关于发布的解决方案之一的问题——这个帖子上被接受的解决方案:

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

例如,在以下部分:

void addStringToHolder(stringHolder * holder, const char * string) {
    char ** newStrings = realloc(holder->strings, newStringCount * sizeof(char *));
    if (newStrings != NULL) {
        holder->strings = newStrings;
    }
}
(我们正在使用struct处理此函数)

双指针
字符串
真的可以在这个函数中修改吗?
我想我们总是要传递一个指向我们想要修改的对象的指针,而不是对象本身。如果我们想修改双指针,难道不需要传入一个三重指针吗

当然,我们首先也要传递一个指向结构的指针,那么这是否可以实现呢?我想我在所有这些指针中迷失了方向。稍微澄清一下会有帮助的。希望理解这个案例能让我理解其他案例

双指针
字符串
真的可以在这个函数中修改吗

很快,是的

详细说明:

C中的指针只是内存中的一个位置,当您将它传递给函数时,您只需告诉函数在何处执行其操作

通过传递指向该结构的指针,我们通过引用调用它的所有元素,因此我们可以修改它的任何元素,包括双指针
字符串

假设我们有一个指向您的struct
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"*/
使用指针算法,我们可以在任何需要的地方获取并修改值(只要我们保持以null结尾的字符串的C约定)


依此类推。

您通过将指针传递到结构来告诉函数:嘿,内存中的某个位置有一些东西,请转到那里,随意乱放。确实如此。只是为了确定,
const char*
的第二个参数
string
是否应该未使用?它正在传入,但我没有看到变量
string
@EugeneSh的任何文字用法。因此,传入指向结构的指针允许我们修改结构的任何元素。这似乎很合理,谢谢。现在,为什么我们要传递一个指向结构的双指针,就像在
void createNewStringHolder(stringHolder**holder){(*holder)=malloc(sizeof(stringHolder));}
中一样?我们可能正在更改分配给结构的内存大小,但是当它在主函数中声明时,它的定义中是否已经有了这个大小?这个改变是什么?@8质子我只是在函数中我不理解的部分添加了,以便使我的问题更具可读性。您可以在链接中看到更完整的上下文。它是一个双指针,因为它旨在指向多个字符串。每个字符串都由一个指针指向,而一组字符串由一组指针指向,因此您需要一个指向指针的指针。感谢您的解释!我认为这里的关键答案是尤金·什指出的(哈!)。通过传入指向该结构的指针,可以修改该结构的所有内容。我理解这些示例中指针是如何工作的——我主要关心的是,由于我们对双指针使用了
realloc
,所以双指针有时需要更改位置,所以我想确保它确实是通过引用而不是值调用的,以便在必要时可以修改它。Eugene Sh.确认了这一点,因为我们正在传递指向结构的指针。再次感谢!
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"*/
*(h_ptr->strings + 1) /*the second "string" in strings array*/
*(*(h_ptr->strings + 2) + 4) /*the fifth char in the third "string"*/