mallocing是否等效于具有指定数组大小的指针

时间:2013-02-22 22:02:57

标签: c pointers

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

就是这样:

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

相同

char * input [24];

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

谢谢!

4 个答案:

答案 0 :(得分:6)

不,他们不一样。

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

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

char *input[24];

将在堆栈上创建一个包含24个char 指针的数组。

,这些指针不会指向任何东西(或init上的垃圾)。

对于第二个示例,您可以接受数组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 );
    }

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

答案 1 :(得分:5)

这些都不一样。

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

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

char *input[24];

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

答案 2 :(得分:1)

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

观察结果:

    根据定义,
  • sizeof(char)是一个,所以你可以把它留下来。 (不,它不会传达记录目的。您最好将其重写为char *input = malloc( 24 * sizeof *input );
  • malloc的调用很少有整数文字。如果你的例子中有(24),那么通常会有一个数组来保存(有关堆栈使用的一些注意事项,我在这里踩到了)。

希望这有帮助,

答案 3 :(得分:0)

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