【问题标题】:Memory allocation with malloc?用malloc分配内存?
【发布时间】:2013-02-23 10:26:50
【问题描述】:

下面是sn-p的代码:

int main(void) {

    char sizing[] = "manshcanshcnams cndhan sndhcna snshans";
    char *xyz = malloc(sizeof(char));
    printf("%ld\n",sizeof(xyz));
    xyz = sizing;    // IT SHOULD FAIL HERE
    printf("Fail %s\n",xyz );
    return 0;

}

如您所见,我正在尝试为 xyz 分配更多内存,而不是它可以容纳的内存。但输出不会失败。这是未定义的行为吗?

【问题讨论】:

    标签: c memory-management malloc


    【解决方案1】:

    我的理解是 malloc() 不应该失败,除非它不能分配它所要求的内存量。但是,当您使用它时,您需要在不再需要它时释放该内存,否则您的程序将请求越来越多的内存,最终请求将失败,因为您没有发布任何东西。

    此外,并非所有非法内存操作都会导致错误,例如(代码编辑于 2013-03-08,基于 Kludas 观察到以前的版本无法编译):

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        char myString[4];
        strcpy(myString, "abcdefghijklmnopqrstuvwxyz");  /* This overflows the buffer */
                                                         /* but MIGHT NOT cause an    */
                                                         /* immediate crash!          */
        printf("myString = [%s]\n", myString);
        return 0;
    }
    

    这可能会或可能不会触发错误,但这肯定是非法的,因为我将 26 个字符写入一个只能包含 4 个项目(三个字符加上终止 NULL)的数组。

    【讨论】:

    • 这甚至不会编译。您正在尝试将指向字符串文字的指针分配给数组。
    【解决方案2】:

    你所做的只是告诉指针 xyz 指向与 sizing 相关的内存地址。没有理由会失败。

    【讨论】:

      【解决方案3】:

      您不能使用= 复制字符串。 xyz = sizing 只是修改了变量xyz 使其指向数组sizing,而不是指向你分配的内存。

      因此,您的内存已泄漏,但没有未定义的行为(除了您忘记包含 &lt;stdio.h&gt; 和 &lt;stdlib.h&gt;)。

      【讨论】:

      • 我们可以 xyz 持有内存然后分配给它什么?
      • xyz 不会“保留内存”。这是一个指针。它指向记忆。
      • @UnderDog 尝试使用您的代码将 char *xyz = malloc(sizeof(char)); 替换为 char *xyz;。
      • @UnderDog:考虑阅读stackoverflow.com/a/5754/13005。它很长,但它可能会纠正您的理解。
      • 所以假设当我们创建一个链接列表,并为其分配一些空间。什么时候会失败,或者链接列表会继续增长?我只是想了解 malloc 应该失败的情况
      猜你喜欢
      • 2012-12-26
      • 1970-01-01
      • 2017-12-05
      • 2013-07-04
      • 2022-11-10
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      相关资源
      最近更新 更多