c - mallocing 是否等同于具有指定数组大小的指针

标签 c pointers

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

这是:

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/

相关文章:

c - 内部标识符(例如自动/局部变量和标签)是否由链接器链接?

c - inotify_add_watch 是否按升序返回监视描述符?

c - 为什么代码使用2个指针变量

c - Null/void 指针不正确的值

我可以在 Microchip C18 中制作一个接受 ram 和 rom 指针的函数吗?

用于创建可处理数百万行的 XLSX 文档的 Python(或 C)库

创建节点时指针的 C++ 问题

c++ - 为什么函数 std::basic_streambuf::seth() 采用非常量参数

Java:替代 LinkedList 或 int 指针数据结构

c - pinsrd/_mm_insert_epi32 与字节指针对齐?