了解C中的内存访问

时间:2014-03-05 20:42:23

标签: c pointers

请考虑以下事项:

int i;
i = 12;

这显然不会给出任何错误。但是,以下是:

int *i;
*i = 12;

Program received signal:  “EXC_BAD_ACCESS”.

为什么我没有修改整数的权限?它还在进程的地址空间吗?

4 个答案:

答案 0 :(得分:1)

您不为整数分配内存,只需创建指针即可。即当您尝试访问指针指向的任何内容以设置值时,指针不会指向任何有效的已分配内存。

如果你想学习C,了解这个基本级别的记忆是必要的。我建议你购买C书的介绍,或者在线查阅教程。其中一个开始的地方是:http://www.cprogramming.com/tutorial/c-tutorial.html

答案 1 :(得分:1)

你错过了一步。当你说:

int *i;

你所拥有的是指向整数的指针。现在,它并没有特别指向任何整数,这就是为什么你不能取消引用它并改变它的原因。您需要将i设置为:

int j = 5;
i = &j;

现在,i是一个指向j值的指针,它是5.您现在可以更改值:

*i = 6; // j (which i points to) is now 6

答案 2 :(得分:1)

要添加已经提到的答案,您需要将指针指向某个东西,或者为指针分配内存,以便内存中有空间指向。你可以这样做:

int *i;
i = malloc(sizeof(int));
if(i == NULL) // or if(i == 0) or if(NULL == i) or whatever you prefer
    fprintf(stderr,"Some error blah blah\n")
*i = 5;
printf("i = %d\n",*i);

那也行得通。请确保在执行此操作后使用malloc来测试空指针,否则如果由于某些奇怪的原因您无法分配int所需的内存,则可能会在以后遇到问题。

答案 3 :(得分:0)

不,当您在没有为其分配内存的情况下声明指针时,不能保证指向进程地址空间中的有效地址。 例如,假设它是一个32位指针,您的假设意味着每个进程都有4 GB的可用内存。但您可能在计算机中甚至没有4 GB的物理内存。 分配内存时实际发生的事情是设置CPU或虚拟内存硬件,以便将程序中的虚拟地址转换为物理内存地址。 您可以在维基百科中阅读有关虚拟内存的更多信息,请参阅http://en.wikipedia.org/wiki/Virtual_memory