我在C中遇到了一个奇怪的现象,我需要有人来解释.我有下面的代码,2个单元素数组作为全局变量.我正在打印每个数组的第一个和第二个元素的内存地址(请注意,该数组被定义为只有1个元素):
#include <stdio.h>
int a1[1];
int a2[1];
int main(void) {
a1[0] = 100;
a2[0] = 200;
printf("%d\n", &a1[0]);
printf("%d\n", &a1[1]);
printf("%d\n", &a2[0]);
printf("%d\n", &a2[1]);
}
Run Code Online (Sandbox Code Playgroud)
这给出了以下输出.注意,C在a1之后为数组a2分配了一个连续的内存块(因此a1 [1]和a2 [0]的地址相同):
4223424
4223428
4223428
4223432
Run Code Online (Sandbox Code Playgroud)
但是,当我更改数组的名称时会出现奇迹.我在这两个数组中添加了"zzz"作为前缀,如下所示.
#include <stdio.h>
int zzza1[1];
int zzza2[1];
int main(void) {
zzza1[0] = 100;
zzza2[0] = 200;
printf("%d\n", &zzza1[0]);
printf("%d\n", &zzza1[1]);
printf("%d\n", &zzza2[0]);
printf("%d\n", &zzza2[1]);
}
Run Code Online (Sandbox Code Playgroud)
运行此代码后,您可以从以下输出中看到,首先为数组zzza2分配内存,然后为zzza1(&a2 [1] =&a1 [0])分配内存:
4223428
4223432
4223424
4223428
Run Code Online (Sandbox Code Playgroud)
我已经在不同的时间在不同的机器上测试了多个阵列大小(2,4,8)的上述代码并获得了相同的输出,因此这不是巧合.当我将main()中的变量定义为局部变量时,不会发生这种情况.
看来C正在根据我们提供给数组的名称来分配内存.首先,为什么C每次都会将连续的块分配给不同的全局数组?其次,当我添加前缀时,为什么内存分配的顺序会发生变化?
希望这并不会让每个人感到困惑,因为它有我......感谢您的帮助!
我有2个未排序的数组.将它们单独排序然后合并它们会更快吗?或者首先连接数组并对组合的巨大数组进行排序会更快吗?
我正在编写一个eclipse插件,它通过几个按钮向用户公开了一个视图.在单击任何按钮时,我想将某个注释粘贴到用户当前正在工作的编辑器窗口以及他指向的光标位置.
用户单击该按钮后,编辑器窗口将不再具有焦点,并且以下代码不起作用.
workbench.getActiveWorkbenchWindow().getActivePage().getActiveEditor()
Run Code Online (Sandbox Code Playgroud)
如何在用户单击按钮之前检测用户工作的编辑器窗口和光标位置?
我有以下代码:
void func(uint8 *var) {
uint8 tempvar;
if (var)
var = &tempvar;
*var = 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用以下方法调用函数:
func(NULL);
Run Code Online (Sandbox Code Playgroud)
代码在"*var = 0;"行给出了分段错误 因为var仍然指向内存地址0x0.我不明白为什么我对临时变量的赋值不起作用!