简单的c malloc

时间:2010-05-20 13:43:39

标签: c malloc

这不起作用:

void function(char* var)
{
    var = (char*) malloc (100);
}

int main()
{
    char* str;
    function(str);
    strcpy(str, "some random string");
    printf("%s\n", str);

    return 0;
}

这样做:

void function(char* var)
{
    //var = (char*) malloc (100);
}

int main()
{
    char* str;
    //function(str);
    str = (char*) malloc (100);
    strcpy(str, "some random string");
    printf("%s\n", str);

    return 0;
}

为什么?

5 个答案:

答案 0 :(得分:13)

你必须传递指针的地址以分配你希望里面函数的地址,否则你只是传递它的副本:

void function(char** var)
{
    *var = malloc (100);
}

int main()
{
    char* str;
    function(&str);
    strcpy(str, "some random string");
    printf("%s\n", str);

    return 0;
}

答案 1 :(得分:4)

您需要使用指向指针的指针作为char **的参数 当您将指针作为参数传递时,它会被复制,因此您在函数内部获得的只是指向同一位置的另一个指针。

您需要收到char **并执行:

my_alloc_fun(void **ptr){
    *ptr= malloc(size);
}
void *myptr;
my_alloc_fun(&myptr);

这样,你得到函数内部指针的地址,这样你就可以让原始指针指向新分配的内存。

答案 2 :(得分:3)

当您致电function(str)时,您将str的值传递给function。此值是一些未初始化的垃圾值,因为您尚未将其设置为main中的任何值,但这不是问题。

问题是function有自己的指针var,它将垃圾值放入其中,以便人们可以说var points to the same thing (garbage) that str points to。但是,它们不是同一个变量。它们是两个不同的变量,更改varstr没有影响。

当您说var = (char*) malloc (100);时,您正在某处分配内存,然后告诉var指向它。现在var指向与str不同的位置。您立即从该函数返回,丢失var以及该内存的位置。顺便说一句是内存泄漏。

当你返回main时,str就像往常一样 - 指向垃圾。

一个数字例子:

char *str;     // str -> 0xfeedface   (garbage)
function(str);

// inside 'function', an initialization like this occurs
char *var = str;  // var -> 0xfeedface (same garbage)
var = (char*) malloc (100); // var -> 0x12341234 (alloc'd memory)
return;

// back in 'main'
strcpy(str, "some random string"); // str still points to 0xfeedface!

要正确执行此操作,您需要更改str的值。这意味着function需要指向str的指针,或指向指针的指针

void function(char **var)
{
   *var = (char*)malloc(sizeof(char) * 100);
}

int main()
{
   char *str;
   function(&str);
   strncpy(str, "some random string", 99);
   ...
   free(str);  // important in general
}

答案 3 :(得分:1)

指针就像任何其他变量一样;区别仅在于它们的价值所代表的含义。 double具有表示双精度浮点数的值,而int具有表示有符号整数的值,而指针具有表示另一个变量的位置的值。 / p>

指针本身仍然按值传递给其他函数;所以你的例子不能用于这个类似的功能不起作用的原因:

void function(int var)
{
    var = 100;
}

int main()
{
    int num;
    function(num);
    printf("%d\n", num);

    return 0;
}

两种情况下的答案都是相同的:当function()更改参数var的值时,它只更改其本地副本 - 它不会更改{{1}内的变量1}}。

答案 4 :(得分:0)

请参阅我对C Programming: malloc() inside another function的回答,了解如何考虑这个问题。