【发布时间】:2016-09-20 03:08:36
【问题描述】:
我有一个结构,其中包含我需要通过引用传递给函数的成员。在那个函数中,我想分配内存并赋值。我在某处遇到问题 - 似乎在代码从 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,我的字符串为空。
谁能告诉我我做错了什么?
【问题讨论】:
-
allocateMemory(p->myString);-->allocateMemory(&p->myString);,allocateMemory(void *str)-->allocateMemory(char **str)andstr = malloc(8)-->*str = malloc(8) -
您在
allocateMemory()中修改了str的本地副本,但这不会影响调用代码中的任何内容。要么让函数返回指向分配空间的指针,要么传递void **str并使用*str = malloc(8);。 -
@kaylum,你为什么把答案写成 cmets?
-
你为什么要在堆上而不是在栈上分配一个恒定的大小(例如,
char str[8] = {0};)? -
@Will 我不会 - 这只是一些适用于更复杂范围的示例代码。不过好点!