我已经阅读了有关指针的各种教程,现在我提出了一个问题,
就是这样:
char * input = malloc(sizeof(char)* 24);
与
相同char * input [24];
我的印象是malloc还会在堆上创建24个插槽。通常,我看到char输入[24],但我认为char *输入[24]比mallocing更简单。
谢谢!
答案 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
,但内存在堆栈而不是堆上。