在这个问题,有人建议意见,我应该不会投的结果malloc,即
int *sieve = malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?
所以我看到了一些关于如何找到架构的字节顺序的例子.假设我们有一个指向int数据类型的整数指针.让我们说int值是0x010A0B12.在小端架构中,最低有效字节(即12)将存储在最低内存地址中,对吧?因此,4字节整数中的最低字节为12.
现在,检查.如果我们声明了一个char指针p,并且将整数指针强制转换为char*并将其存储在p中,并打印出取消引用的p值,我们将获得该架构的字节序的线索.如果它是12,我们就是小尾数; 01表示大端.听起来真的很整洁......
int a = 0x010A0B12;
int *i = &a;
char *p = (char*)i;
printf("%d",*p); // prints the decimal equivalent of 12h!
Run Code Online (Sandbox Code Playgroud)
这里有几个问题,真的.由于指针是强类型的,字符指针不应该严格指向char数据类型吗?用%d打印的是什么?难道我们不应该用%c打印字符吗?
这是我运行的程序:
#include <stdio.h>
int main(void)
{
int y = 1234;
char *p = &y;
int *j = &y;
printf("%d %d\n", *p, *j);
}
Run Code Online (Sandbox Code Playgroud)
我对输出有点困惑.我所看到的是:
-46 1234
Run Code Online (Sandbox Code Playgroud)
我把这个程序写成了一个实验,不知道它会输出什么.我期待可能有一个字节y.
这里发生了什么"幕后"?解除引用如何p给我-46?
正如其他人指出的那样,我必须进行明确的施法才能导致UB.我没有改变这一行char *p = &y;,char *p = (char *)&y;所以我没有使下面的答案无效.
此程序不会导致此处指出的任何UB行为.