我昨天在一个IRC频道遇到过这个,并且不明白为什么这是不好的行为:
#include <stdio.h>
int main(void)
{
char x[sizeof(int)] = { '\0' }; int *y = (int *) x;
printf("%d\n", *y);
}
Run Code Online (Sandbox Code Playgroud)
是否有任何数据丢失或任何损失?谁能给我任何文件来进一步解释它做错了什么?
Mat*_*lan 10
数组x可能无法在内存中正确对齐int.在x86上你不会注意到,但在其他架构上,例如SPARC,解除引用y会触发总线错误(SIGBUS)并导致程序崩溃.
任何地址都可能出现此问题:
int main(void)
{
short a = 1;
char b = 2;
/* y not aligned */
int* y = (int *)(&b);
printf("%d\n", *y); /* SIGBUS */
}
Run Code Online (Sandbox Code Playgroud)
首先,x不保证阵列正确对齐int.
有一个关于这可能会影响放置等技术的对话话题new.应该注意的是,在正确对齐的内存中也需要放置新的内容,但是新的贴片通常与动态分配的内存一起使用,并且需要分配函数(在C和C++中)以返回适合任何类型的内存所以地址可以分配给任何类型的指针.
对于自动变量的编译器分配的内存,情况也是如此.
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |