【发布时间】:2013-02-08 15:32:43
【问题描述】:
我已经阅读了各种关于指针的教程,现在我提出一个问题,
这是:
char *input = malloc(sizeof(char)*24);
同
char *输入[24];
我的印象是 malloc 也会在堆上创建具有 24 个插槽的空间。通常,我看到 char input[24],但我认为 char *input[24] 比 mallocing 更简单。
谢谢!
【问题讨论】:
我已经阅读了各种关于指针的教程,现在我提出一个问题,
这是:
char *input = malloc(sizeof(char)*24);
同
char *输入[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); 请注意 input 如何是指向指针的指针。你想指向一个字符指针数组,所以这是正确的。但是,现在请记住,仅此一项只会构成指针块。您仍然需要通过为实际字符串或其他内容分配空间来设置指针。
这些根本不一样。
char *input = malloc(sizeof(char)*24);
这会分配足够的内存来容纳 24 个char,并将地址分配给input(一个指针)。此内存是动态分配的,因此需要在某个时候通过适当调用free() 来释放它。
char *input[24];
这将input 声明为一个包含 24 个指针的数组。这有自动存储,这意味着您不需要free 它。 (但是,您可能需要 free 每个指针所指向的东西,但这是另一回事!)
【讨论】:
const char *input[24](即使编译器允许您在没有const 的情况下逃脱)。其次,无论如何您都不应该尝试修改这些文字。
从根本上说,这两个变量的类型是不同的。在第一种情况下,您声明了一个指向char 的指针,该指针指向由malloc 动态分配的内存(在道德上,您有义务稍后指向free)。在第二种情况下,您声明 一个指向 char 的指针数组。
几个观察:
sizeof(char) 是一个定义,所以你可以忽略它。 (不,它没有传达记录目的。您最好将其重写为char *input = malloc( 24 * sizeof *input );)malloc 的调用很少有整数文字。如果在您的示例中确实如此 (24),那么通常人们更愿意使用一个数组来保存它(关于堆栈使用的一些注意事项,我在这里回避)。希望这会有所帮助,
【讨论】:
您可以将其与char input[24]; 进行比较(注意没有*)。有了它,您可以以相同的方式使用input,但内存在堆栈上而不是在堆上。
【讨论】: