在 C 中给出以下代码:
char str[] = "";
size_t size = strlen(str) + 1;
char *actual = memset(malloc(size), '@', size);
运行此命令后,实际 =“@”。
如果 malloc 只为实际变量分配 1 个字节,
如何用 '@' 初始化它,这需要 2 个字节(因为空字符)?
谢谢
我尝试运行代码,我认为它会引发错误,但事实并非如此。
运行此命令后,实际 =“@”。
该帖子不包含对此断言的支持。可能你在代码中添加了
printf("%s\n", actual);
,程序打印了“@”。这并不意味着 memset
在 '@'
之后放置一个空字节。
char *actual = memset(malloc(size), '@', size);
分配一个字节并将其设置为'@'
。它不控制该字节之后出现什么值,甚至不控制该地址映射有任何内存。
内存中可能在
'@'
之后有一个字节包含值零,并且 printf
查看 actual
指向的内存并找到 '@'
和空字节并打印 '@'
。然而,这不是您可以依赖的行为。 '@'
之后的字节可能包含不同的值,并且 printf
的行为会有所不同。
此外,由于这种情况下的行为不是由 C 标准定义的,因此编译器的优化可能会以您可能会感到惊讶的方式改变您的程序。例如,编译器确定行为未定义将符合 C 标准,因此可以消除程序中的所有代码。