所以我正在寻找有用的东西的澄清。我很确定我理解发生了什么,但在继续我的工作之前一定要确定。
我有一个定义如下的函数:
name* createName(char* firstName, char* lastName)
{
name* newName = (name*)malloc(sizeof(name));
initStringValue(&newName->firstName, firstName);
initStringValue(&newName->lastName, lastName);
newName->firstNameSize = strlen(newName->firstName);
newName->lastNameSize = strlen(newName->lastName);
return newName;
}
结构"名称"定义如下:
struct name
{
char* firstName;
char* lastName;
int firstNameSize;
int lastNameSize;
};
负责名称字符串副本的另一个函数如下所示:
void initStringValue(char** destination, char* source)
{
int length = strlen(source) + 1;
int size = length * sizeof(char);
*destination = (char*)malloc(size);
memset(*destination, 0, size);
strcpy(*destination, source);
}
如果我理解我在这里所做的事情,请使用&运算符我已经表示我希望不发送值而是发送其相关的内存地址。在诸如
之类的陈述中&newName->firstName
其中struct member firstName是char *我表示我想发送这个指针的内存地址而不是指针值(这恰好是一个内存地址本身)。 - >运算符将此指针取消引用指针的成员,然后是& operator本质上将我们返回到firstName内存引用,允许我操作该内存引用的信息。
现在事情变得疯狂(无论如何对我来说)。为了实际使用该内存引用,我最终使用双重间接(因此非常被动的攻击性)。因为它跟随一个内存引用(比如& newName-> firstName)发送到一个char **,就像initStringValue函数中的char **目标一样,将是指针的指针,后者被分配给内存& newName-> firstName返回的引用。然后使用* destination I' m使用指向& newName-> firstName的内存引用的指针。或者换句话说,指针的第一个也是唯一一个成员是newName-> firstName。
的内存引用我是否真的理解这一点?
答案 0 :(得分:2)
我是否真的理解这一点?
阅读完您的描述后,我会说是
我试着用一些例子来解释它。
如果你这样做:
void foo(int a)
{
a = 5;
}
int main()
{
int a = 10;
foo(a);
printf("%d\n", a);
return 0;
}
您将获得输出:10
那是因为函数参数是函数的局部变量。换句话说 - 当函数返回时,对函数参数所做的任何更改都将丢失,即main
中的变量不会更改。
如果你想要一个函数改变main
中变量的值(也就是在调用者中),你必须传递一个指针。像:
void foo(int* a) // notice int*
{
*a = 5; // notice *a
}
int main()
{
int a = 10;
foo(&a); // notice &a
printf("%d\n", a);
return 0;
}
这将输出:5
无论何种类型,这都是一般规则。我在示例中使用了int
,但它也适用于任何类型 - 指针。
所以让我们用指针做一个例子:
void foo(char** a, int size) // notice char**
{
*a = malloc(32); // malloc memory
strcpy(*a, "Hello world"); // copy some data into the memory
}
int main()
{
char* a = NULL; // a is not pointing to anything yet
foo(&a);
// Now a points to the malloc'ed memory
printf("%s\n", a);
return 0;
}
这将输出:Hello world