我已经阅读了各种关于指针的教程,现在我提出一个问题,
这是:
char *input = malloc(sizeof(char)*24);
和
一样字符 *输入[24];
我的印象是 malloc 还会在具有 24 个插槽的堆上创建我的空间。通常,我会看到 char input[24],但我认为 char *input[24] 是一种比 mallocing 更简单的方法。
谢谢!
最佳答案
不,它们不一样。
char *input = malloc(sizeof(char)*24);
将在堆上分配一个 24 个字符的 block ,并将指向该 block 开头的指针分配给输入。 (从技术上讲,您只是告诉它分配 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) );
}
然后你会在堆栈上有一个字符指针数组。这些指针中的每一个都指向堆上的一个字符 block 。
但是请记住,当函数退出并且该变量超出范围时,堆栈上的内容将被弹出。如果您 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 );
}
请记住,在此示例中,您必须释放输入中的每个指针,然后在适当的时候输入自身以避免内存泄漏。
关于c - mallocing 是否等同于具有指定数组大小的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15033952/