【问题标题】:Allocating memory to a struct member pointer in C将内存分配给C中的结构成员指针
【发布时间】: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-&gt;myString,我的字符串为空。

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

【问题讨论】:

  • allocateMemory(p-&gt;myString); --> allocateMemory(&amp;p-&gt;myString);, allocateMemory(void *str) --> allocateMemory(char **str) and str = malloc(8) --> *str = malloc(8)
  • 您在allocateMemory() 中修改了str 的本地副本,但这不会影响调用代码中的任何内容。要么让函数返回指向分配空间的指针,要么传递void **str 并使用*str = malloc(8);
  • @kaylum,你为什么把答案写成 cmets?
  • 你为什么要在堆上而不是在栈上分配一个恒定的大小(例如,char str[8] = {0};)?
  • @Will 我不会 - 这只是一些适用于更复杂范围的示例代码。不过好点!

标签: c pointers struct malloc


【解决方案1】:

您需要传递结构成员的地址,然后您可以对其进行更改(也就是分配内存)。在您的函数版本中,您没有采用指针而不是指针的引用,因此您可以更改指针引用的内存内容,但不能更改指针本身。

所以把你的函数改成

void allocateMemory(char **ret_str)
{
    char *str = malloc(8);

    str[0] = 'a';
    str[1] = 0;
    *ret_str = str;
}

然后称它为

allocateMemory(&p->myString)

【讨论】:

  • 谢谢。我认为第一行应该是char *str = malloc(8);
  • @RyanFoley,是的,当然。
【解决方案2】:

编写与 Rohan 相同的函数的另一种方法,无需定义任何新变量:

void allocateMemory(char **str, size_t size) {
    *str = malloc(size);
    (*str)[0] = 'a';
    (*str)[1] = '\0';
}

请注意,我首先传递了一个size 参数来证明使用malloc() 的合理性。

【讨论】:

    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    相关资源
    最近更新 更多