我有一个带有成员的结构,我需要通过引用传递给一个函数。在那个功能中,我想分配内存&分配一个值。我在问题的某个地方遇到了问题 - 似乎在代码从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;
}
如果我在str
内打印allocateMemory
的值,则&#39; a&#39;已成功打印,但如果我尝试在p->myString
中打印main
,则我的字符串为空。
谁能告诉我我做错了什么?
答案 0 :(得分:0)
您需要传递结构成员的地址,然后您可以更改(也称为分配内存)。在您的函数版本中,您没有使用指针而不是指针的引用,因此您可以更改指针引用的内存内容,而不是指针本身。
所以将你的功能改为
void allocateMemory(char **ret_str)
{
char *str = malloc(8);
str[0] = 'a';
str[1] = 0;
*ret_str = str;
}
然后将其称为
allocateMemory(&p->myString)
答案 1 :(得分:0)
另一种编写Rohan所做功能的方法,无需定义任何新变量:
void allocateMemory(char **str, size_t size) {
*str = malloc(size);
(*str)[0] = 'a';
(*str)[1] = '\0';
}
请注意,我首先传递size
参数来证明使用malloc()
。