【问题标题】:Is mallocing equivalent to pointer with a specified array sizemallocing 等效于具有指定数组大小的指针
【发布时间】:2013-02-08 15:32:43
【问题描述】:

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

这是:

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

char *输入[24];

我的印象是 malloc 也会在堆上创建具有 24 个插槽的空间。通常,我看到 char input[24],但我认为 char *input[24] 比 mallocing 更简单。

谢谢!

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    不,它们不一样。

    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 );
        }
    

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

    【讨论】:

    • 你能 malloc 一个指针数组吗,在它被释放之前它是有效的?类似于创建一个指针数组,假设每个位置都指向一个字符串,你可以使用 malloc 执行相同的操作吗?
    • @user2098078 当然可以。 char **input = malloc( sizeof(char *) * 24); 请注意 input 如何是指向指针的指针。你想指向一个字符指针数组,所以这是正确的。但是,现在请记住,仅此一项只会构成指针块。您仍然需要通过为实际字符串或其他内容分配空间来设置指针。
    • @user2098078 在答案中添加了示例
    【解决方案2】:

    这些根本不一样。

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

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

    char *input[24];
    

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

    【讨论】:

    • 我是否需要 malloc 指针的每个位置,如第二个 24 指针数组,是否必须在使用前对数组的每个元素进行 malloc,或者我可以直接说输入 [0] = "奥利" 和输入 [1] = "查尔斯沃思?谢谢
    • @user2098078 -- 通常,是的,您需要为数组中的每个元素分配内存。但是,对于您自己提供的示例尝试,您可以执行您所展示的操作但请注意以下警告。首先,您应该将其声明为const char *input[24](即使编译器允许您在没有const 的情况下逃脱)。其次,无论如何您都不应该尝试修改这些文字。
    【解决方案3】:

    从根本上说,这两个变量的类型是不同的。在第一种情况下,您声明了一个指向char指针,该指针指向由malloc 动态分配的内存(在道德上,您有义务稍后指向free)。在第二种情况下,您声明 一个指向 char 的指针数组

    几个观察:

    • sizeof(char) 是一个定义,所以你可以忽略它。 (不,它没有传达记录目的。您最好将其重写为char *input = malloc( 24 * sizeof *input );
    • malloc 的调用很少有整数文字。如果在您的示例中确实如此 (24),那么通常人们更愿意使用一个数组来保存它(关于堆栈使用的一些注意事项,我在这里回避)。

    希望这会有所帮助,

    【讨论】:

    • 绝对有帮助。谢谢
    【解决方案4】:

    您可以将其与char input[24]; 进行比较(注意没有*)。有了它,您可以以相同的方式使用input,但内存在堆栈上而不是在堆上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2022-01-02
      • 2010-12-21
      相关资源
      最近更新 更多