当前位置: 首页 > 知识库问答 >
问题:

C中的指针混淆

夏建木
2023-03-14
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a = 4;
    int *p = malloc(sizeof(int) * a);
    int *g = malloc(sizeof(int) * a);
    p += 8;
    printf("%p\n", p);
    printf("%p\n", g);
    
}

我已经运行这个程序好几次了,每次最后打印的p和g的值都是一样的。我不太确定为什么会这样——malloc不能在理论上选择内存中的任何位置让p和g指向吗?为什么p 8总是等于g?如果能澄清,将不胜感激。

谢谢

共有1个答案

雷硕
2023-03-14

我已经运行这个程序好几次了,每次最后打印的p和g的值都是一样的

这是因为你的内存是如何分配的。

第一个malloc为4个整数分配内存。假设它们每个是4个字节,所以是16个字节。

0              1              2              3 
0123456789abdef0123456789abdef0123456789abdef0123456789abdef
^--------------
p

第二个malloc为另外4个整数分配内存。这个内存可以分配在任何空闲插槽中,但它恰好是这样的。

0              1              2              3 
0123456789abdef0123456789abdef0123456789abdef0123456789abdef
^--------------               ^--------------
p                             g

如果将8添加到p,则将其移动8个整数,32个字节,即g。

间隙中的记忆是什么?谁知道呢。内存可以分配,但malloc认为合适。

然而,不能保证内存将以这种方式分配。在我的系统上,p=4意味着没有间隙。

 类似资料:
  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • C++ 类 & 对象 在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。 友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。 下面的实例有助于更好地理解 this 指针的概念:#include <iostream> using namespace std; c

  • C++ 类 & 对象 一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符 ->,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。 下面的实例有助于更好地理解指向类的指针的概念: #include <iostream> using namespace std; class Box { public:

  • 学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:#include <iostr

  • 但我想使用一个指针,而不是一个简单的变量。能给我点启示吗? 谢谢

  • 主要内容:1. 指针是什么?,2. 如何使用指针?,3. Objective-C NULL指针,4. Objective-C指针详解Objective-C中的指针简单易学。使用指针可以更轻松地执行某些Objective-C编程任务,并且在不使用指针的情况下无法执行其他任务(如动态内存分配)。 所以有必要学习指向成为一个完美的Objective-C程序员。在这小节中将通过简单的步骤学习指针。 每个变量都是一个内存位置,每个内存位置都定义了它的地址,可以使用符号()运算符进行访问,该运算符表示内存中