用malloc分配内存?

时间:2013-03-08 00:18:30

标签: c memory-management malloc

以下是代码片段:

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分配更多内存,然后它可以容纳的内容。但输出不会失败。这是一个未定义的行为吗?

3 个答案:

答案 0 :(得分:3)

您无法使用=复制字符串。 xyz = sizing只需修改变量xyz,使其指向数组sizing,而不是指向您所采用的内存。

所以,你的记忆已被泄露,但没有未定义的行为(除了你忘了包含<stdio.h><stdlib.h>)。

答案 1 :(得分:1)

您所做的只是告诉指针 xyz 指向与大小调整相关联的内存地址。没有理由这会失败。

答案 2 :(得分:-1)

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

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

#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)。