在C语言中为结构成员指针分配内存



我有一个结构体,其中有一个成员需要通过引用传递给函数。在该函数中,我想分配内存&赋值。我在沿途的某个地方遇到了问题-似乎在代码从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()是正确的。

相关内容

  • 没有找到相关文章

最新更新