1

以下是代码片段:

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

4

3 回答 3

3

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

因此,您的内存已泄漏,但没有未定义的行为(除了您忘记包含<stdio.h>and <stdlib.h>)。

于 2013-03-08T00:20:09.600 回答
1

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

于 2013-03-08T00:21:54.030 回答
-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)的数组。

于 2013-03-08T00:45:26.060 回答