C - 使用双指针的动态内存分配

时间:2011-06-09 05:56:30

标签: c pointers memory-leaks memory-management

我在函数名myalloc()中分配一些内存,并在main()中使用和释放它。 我正在使用双指针来执行此操作,这里的代码工作正常,

//Example # 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void myalloc( char ** ptr)
{
    *ptr = malloc(255);
    strcpy( *ptr, "Hello World");
}

int main()
{
    char *ptr = 0;
    myalloc( &ptr );
    printf("String is %s\n", ptr);
    free(ptr);

    return 0;
}

但是下面的代码不起作用并给出了分段错误。 我认为这是使用双指针的另一种方法。

//Example # 2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void myalloc( char ** ptr)
{
    *ptr = malloc(255);
    strcpy( *ptr, "Hello World");
}

int main()
{
    char **ptr = 0;
    myalloc( ptr );
    printf("String is %s\n", *ptr);
    free(*ptr);

    return 0;
}

请澄清一下,为什么它在第二个例子中给出了我的错误。

注意:语言= C,编译器= GCC 4.5.1,OS = Fedora Core 14

此外,我知道有一些问题已经被问及与使用双指针的内存分配有关,但它们没有解决这个问题,所以请不要将其标记为重复性问题。

3 个答案:

答案 0 :(得分:10)

char **ptr = 0;
*ptr = malloc(255);

尝试将malloc返回的指针写入ptr指向的地址(类型char*)。地址原来是...... 0,这不是可写内存。

ptr应指向您可以写入的地址。您可以执行以下操作之一:

char *stackPtr; // Pointer on the stack, value irrelevant (gets overwritten)
ptr = &stackPtr;
// or
char **ptr = alloca(sizeof(char*)); // Equivalent to above
// or
char **ptr = malloc(sizeof(char*)); // Allocate memory on the heap
// note that ptr can be 0 if heap allocation fails

答案 1 :(得分:0)

char **ptr = 0;
foo( ptr );

您正在传递ptr指向的值。但你还没有把ptr指向任何东西。

*ptr = malloc(255);

现在你正在为那个“没什么”分配一些内存。所以这不会工作,并且会发生段错误。 你为什么这么说这是使用双指针的另一种方式?如果我错了,我道歉,但我猜你之前在Turbo-C中使用过类型的程序?

答案 2 :(得分:0)

在第二种情况下,您将main ptr的值(0(NULL))传递给myalloc()的{​​{1}}。 ptr然后尝试取消引用其空指针myalloc()