关于其中一个已发布的解决方案,我有一个问题 - 此线程中已接受的解决方案: 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
吗?我认为我们总是要传递一个指向我们想要修改的东西的指针,而不是事物本身。如果我们想修改双指针,我们不会传入三重指针吗?
当然我们也首先传入指向结构的指针,这样做是否有效?我想我迷失在所有这些指针中。一点清晰度会有所帮助。希望了解这个案例将使我了解其他人。
答案 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"*/
等等。