Memset内存分配

问题描述 投票:0回答:1

在 C 中给出以下代码:

char str[] = "";

size_t size = strlen(str) + 1;

char *actual = memset(malloc(size), '@', size);

运行此命令后,实际 =“@”。

如果 malloc 只为实际变量分配 1 个字节,

如何用 '@' 初始化它,这需要 2 个字节(因为空字符)?

谢谢

我尝试运行代码,我认为它会引发错误,但事实并非如此。

c memset
1个回答
0
投票

运行此命令后,实际 =“@”。

该帖子不包含对此断言的支持。可能你在代码中添加了

printf("%s\n", actual);
,程序打印了“@”。这并不意味着
memset
'@'
之后放置一个空字节。

char *actual = memset(malloc(size), '@', size);
分配一个字节并将其设置为
'@'
。它不控制该字节之后出现什么值,甚至不控制该地址映射有任何内存。

内存中可能在

'@'
之后有一个字节包含值零,并且
printf
查看
actual
指向的内存并找到
'@'
和空字节并打印
'@' 
。然而,这不是您可以依赖的行为。
'@'
之后的字节可能包含不同的值,并且
printf
的行为会有所不同。

此外,由于这种情况下的行为不是由 C 标准定义的,因此编译器的优化可能会以您可能会感到惊讶的方式改变您的程序。例如,编译器确定行为未定义将符合 C 标准,因此可以消除程序中的所有代码。

© www.soinside.com 2019 - 2024. All rights reserved.