mallocing是否等效于具有指定数组大小的指针

mar*_*iel 4 c pointers

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

这是:

char*input = malloc(sizeof(char)*24);

同样的

char*输入[24];

我的印象是malloc还会在堆上创建24个插槽.通常,我看到char输入[24],但我认为char*输入[24]比mallocing更简单.

谢谢!

Gav*_*n H 6

不,他们不一样.

char *input = malloc(sizeof(char)*24);
Run Code Online (Sandbox Code Playgroud)

将在堆上分配一个24个字符的块,并指定一个指向该块的开头的指针以进行输入.(从技术上讲,你只是告诉它分配x个字节,其中x是每个字符大小的24倍,以字节为单位)

char *input[24];
Run Code Online (Sandbox Code Playgroud)

将在堆栈上创建一个包含24个char 指针的数组.当你编写它们时,这些指针不会指向任何东西(或init上的垃圾).

对于第二个示例,您可以接受数组中的每个指针input并为其分配一些指向堆上的内容.例如:

char *input[NUM_STRS];
for( int i = 0; i < NUM_STRS; i++ )
    {
    input[i] = malloc( MAX_STR_LEN * sizeof(char) );
    }
Run Code Online (Sandbox Code Playgroud)

然后你会在堆栈上有一个字符指针数组.这些指针中的每一个都指向堆上的一个字符块.

但请记住,当函数退出并且该变量超出范围时,将弹出堆栈上的内容.如果你使用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 );
    }
Run Code Online (Sandbox Code Playgroud)

请记住,使用此示例,您必须释放输入中的每个指针,然后在适当的时间输入自己以避免泄漏内存.


Oli*_*rth 5

这些都不一样.

char *input = malloc(sizeof(char)*24);
Run Code Online (Sandbox Code Playgroud)

这会分配足够的内存来保存24 char,并将地址分配给input(指针).这个内存是动态分配的,因此需要在适当的调用时释放它free().

char *input[24];
Run Code Online (Sandbox Code Playgroud)

这声明input是一个包含24个指针的数组.这有自动存储,这意味着你不需要free它.(但是,你可能需要free每个指针指向的东西,但那是另一回事!)