我已经阅读了有关指针的各种教程,现在我提出一个问题,
这是:
字符 *输入 = malloc(sizeof(char)*24);
一样
字符 *输入[24];
我的印象是 malloc 也会在堆上用 24 个插槽创建我的空间。通常,我看到 char input[24],但我认为 char *input[24] 比 mallocing 更简单。
谢谢!
不,它们不一样。
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 );
}
请记住,在此示例中,您必须释放输入中的每个指针,然后在适当的时间输入自身以避免内存泄漏。
这些根本不一样。
char *input = malloc(sizeof(char)*24);
这分配了足够的内存来保存 24 char
,并将地址分配给input
(指针)。此内存是动态分配的,因此需要在某个时候通过适当的调用来释放它free()
。
char *input[24];
这声明input
为一个包含 24 个指针的数组。这有自动存储,这意味着你不需要free
它。(但是,您可能需要free
每个指针指向的东西,但那是另一回事!)
从根本上说,这两个变量的类型是不同的。在第一种情况下,您声明一个指向char
动态分配的内存的指针(您在稍后的时刻malloc
有义务这样做)。free
在第二种情况下,您声明一个指向 char 的指针数组。
几个观察:
sizeof(char)
根据定义是一个,所以你可以忽略它。(不,它没有传达记录目的。您最好将其重写为char *input = malloc( 24 * sizeof *input );
)malloc
具有整数文字。如果24
在您的示例中是 ( ),那么通常人们更愿意使用一个数组来保存它(关于堆栈使用的一些注意事项,我在这里回避)。希望这可以帮助,
您可以将其更好地与char input[24];
(注意没有*)进行比较。有了它,您可以input
以相同的方式使用,但内存在堆栈上而不是在堆上。