我有一个结构体,其中有一个成员需要通过引用传递给函数。在该函数中,我想分配内存&赋值。我在沿途的某个地方遇到了问题-似乎在代码从allocateMemory
返回后,我分配的内存&我分配的值超出了作用域(这可能不是真正发生的事情,但看起来是这样)。
#include <stdio.h>
#include <stdlib.h>
typedef struct myStruct_t
{
char *myString;
} myStruct;
void allocateMemory(void *str);
int main(void) {
myStruct tmp = {
.myString = NULL
};
myStruct *p = &tmp;
allocateMemory(p->myString);
//allocateMemory(&(p->myString)); //also tried this
printf("%s", p->myString);
return 0;
}
void allocateMemory(void *str)
{
str = malloc(8);
((char *)str)[0] = 'a';
((char *)str)[1] = 0;
}
如果我在allocateMemory
中打印str
的值,则成功打印'a',但如果我试图在main
中打印p->myString
,则字符串为空。
您需要传递结构成员的地址,然后您可以更改(即分配内存)给它。在你的函数版本中,你不接受指针,也不接受指针的引用,所以你可以改变指针引用的内存内容,但不能改变指针本身。
将函数改为
void allocateMemory(char **ret_str)
{
char *str = malloc(8);
str[0] = 'a';
str[1] = 0;
*ret_str = str;
}
然后将其命名为
allocateMemory(&p->myString)
Rohan所做的相同函数的另一种编写方法,无需定义任何新变量:
void allocateMemory(char **str, size_t size) {
*str = malloc(size);
(*str)[0] = 'a';
(*str)[1] = ' ';
}
注意,我传递了一个size
参数来证明首先使用malloc()
是正确的。