回复:具有可变大小结构的结构数组——说明
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"*/
等等。
我对已发布的其中一种解决方案有疑问——该线程上已接受的解决方案: .
我会对此发表评论,而不是开始一个新的问题线程,但我目前没有必要的经验。该程序确实按承诺运行并且与我打算实际实现的类似,但我仍然对其中是否可能存在细微的内存问题感到困惑。
例如,在部分中:
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"*/
等等。