将内存分配给C中的结构成员指针

时间:2016-09-20 03:08:37

标签: c pointers struct malloc

我有一个带有成员的结构,我需要通过引用传递给一个函数。在那个功能中,我想分配内存&分配一个值。我在问题的某个地方遇到了问题 - 似乎在代码从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,则我的字符串为空。

谁能告诉我我做错了什么?

2 个答案:

答案 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()

相关问题