【问题标题】:C - dynamic memory allocation using double pointerC - 使用双指针的动态内存分配
【发布时间】:2011-06-09 05:56:29
【问题描述】:

我在函数名 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,操作系统 = Fedora Core 14

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

【问题讨论】:

  • 什么是 foo?它应该是 myalloc 吗?
  • 在这两个例子中,我都忘了用 myalloc() 替换 foo().. 抱歉..

标签: c pointers memory-leaks memory-management


【解决方案1】:
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

【讨论】:

  • @phihag.. 您的第一个解决方案类似于我的第一个示例,对吧?和其他 2 个解决方案都可以接受,谢谢。
  • @mannan 是的,这是您的第一个示例,没有初始化立即被覆盖的指针。
【解决方案2】:
char **ptr = 0;
foo( ptr );

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

*ptr = malloc(255);

现在您正在为“无”分配一些内存。所以这不起作用,并且会出现段错误。 你为什么说这是使用双指针的另一种方式?如果我错了,我深表歉意,但我猜你之前在 Turbo-C 中使用过某种类型的程序?

【讨论】:

  • 我认为双指针可以通过两种方式声明,char **ptr 和 char *p = &(char *),对吗?
  • 甘露聚糖:这里有两个问题。首先是没有“双指针”之类的东西——术语是模棱两可的。您说的是指针到指针类型。第二个问题是变量的类型是你声明它的类型,与你如何设置它的值无关。 char *p = ... 声明并初始化一个指向 char 的指针,无论 = 的右侧是什么。 char **ptr 声明了一个指向 char 的指针。
  • 双指针的概念令人困惑。你写的那行:char **ptr = 0; 首先是没有意义的。指向指针的指针的作用是:您使用它来指向某个指针。因此,为了使用它,您必须有一个它可以指向的有效指针。在您的示例中,您没有这样做。我希望我说得通。
  • 在你真正需要的时候使用指向指针的指针;不仅仅是为了使用它。这是我大学(在印度)的典型行为。我问你关于 Turbo-C 的真正原因是它曾经接受所有此类分配而不是提供段错误。如果您使用它是为了学习它,那么@Karl 很好地解释了它的用法。
【解决方案3】:

在第二种情况下,您将 main 的 ptr 的值(即 0(NULL))传递给 myalloc()ptrmyalloc() 然后尝试取消引用它的空指针 ptr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2015-02-05
    • 2020-12-11
    相关资源
    最近更新 更多