4

我已经阅读了有关指针的各种教程,现在我提出一个问题,

这是:

字符 *输入 = malloc(sizeof(char)*24);

一样

字符 *输入[24];

我的印象是 malloc 也会在堆上用 24 个插槽创建我的空间。通常,我看到 char input[24],但我认为 char *input[24] 比 mallocing 更简单。

谢谢!

4

4 回答 4

6

不,它们不一样。

char *input = malloc(sizeof(char)*24);

将在堆上分配一个 24 个字符的块,并分配一个指向该块开头的指针以供输入。(从技术上讲,您只是告诉它分配 x 个字节,其中 x 是每个字符大小的 24 倍,以字节为单位)

char *input[24];

将在堆栈上创建一个包含 24 个字符指针的数组。这些指针不会指向您编写的任何内容(或初始化时的垃圾)。

对于第二个示例,然后您可以获取数组中的每个指针input并为其分配一些内容以指向堆上。前任:

char *input[NUM_STRS];
for( int i = 0; i < NUM_STRS; i++ )
    {
    input[i] = malloc( MAX_STR_LEN * sizeof(char) );
    }

然后你会在堆栈上有一个字符指针数组。这些指针中的每一个都将指向堆上的一个字符块。

但是请记住,当函数退出并且该变量超出范围时,堆栈上的内容将被弹出。如果你 malloc 一些东西,那个指针在它被释放之前将是有效的,但对于在堆栈上创建的数组来说,情况并非如此。

编辑:根据您的评论,这里是在堆上创建 24 个字符指针并为它们分配空间以指向的示例:

#define NUM_STRS 24
#define MAX_STR_LEN 32
char **input = malloc( sizeof(char *) * NUM_STRS );
for( int i = 0; i < NUM_STRS; i++ )
    {
    input[i] = malloc( sizeof(char) * MAX_STR_LEN );
    }

请记住,在此示例中,您必须释放输入中的每个指针,然后在适当的时间输入自身以避免内存泄漏。

于 2013-02-22T22:05:02.623 回答
5

这些根本不一样。

char *input = malloc(sizeof(char)*24);

这分配了足够的内存来保存 24 char,并将地址分配给input(指针)。此内存是动态分配的,因此需要在某个时候通过适当的调用来释放它free()

char *input[24];

这声明input为一个包含 24 个指针的数组。这有自动存储,这意味着你不需要free它。(但是,您可能需要free每个指针指向的东西,但那是另一回事!)

于 2013-02-22T22:04:39.823 回答
1

从根本上说,这两个变量的类型是不同的。在第一种情况下,您声明一个指向char动态分配的内存的指针(您在稍后的时刻malloc有义务这样做)。free在第二种情况下,您声明一个指向 char 的指针数组

几个观察:

  • sizeof(char)根据定义是一个,所以你可以忽略它。(不,它没有传达记录目的。您最好将其重写为char *input = malloc( 24 * sizeof *input );
  • 很少会调用malloc具有整数文字。如果24在您的示例中是 ( ),那么通常人们更愿意使用一个数组来保存它(关于堆栈使用的一些注意事项,我在这里回避)。

希望这可以帮助,

于 2013-02-22T22:22:45.577 回答
0

您可以将其更好地与char input[24];(注意没有*)进行比较。有了它,您可以input以相同的方式使用,但内存在堆栈上而不是在堆上。

于 2013-02-22T22:10:58.773 回答