【问题标题】:Dynamic memory and pointers动态内存和指针
【发布时间】:2013-02-04 23:05:00
【问题描述】:

我正在编写一个程序,它必须为某种类型分配内存,它必须存储数据的大小以及我传递给它的数据的大小。因此,如果我分配 8 个字节,我需要将内存大小存储在前 4 个字节中,并将剩余大小存储在其他 4 个字节中。我认为这被称为有标题,但我对 C 还是很陌生。 我现在只有分配的空间,我如何在其中存储值?

int * mem_start_ptr; //pointer to start off memory block
    int data; 
    data = &mem_start_ptr; 
    mem_start_ptr = (long *)malloc(sizeof(long)); //reserver 8 bytes

【问题讨论】:

  • 等等..我不明白这个问题
  • long 类型没有 8 个字节,它有 4 个。如果要 8 个字节,则需要 long long。
  • @FredericoSchardong:这取决于你的平台。
  • @OliCharlesworth 哪个平台的 long 类型有 8 个字节?
  • @FredericoSchardong:例如x86 上的 GCC。

标签: c pointers memory header malloc


【解决方案1】:

首先,sizof(long) 是特定于实现的,在 64 位 Linux 上是 8 个字节,而在 Windows 和 32 位 Linux 上是 4 个字节,AFAIK。如果要显式分配 8 个字节,请使用 malloc(8)。虽然,既然你想存储int,看起来,使用malloc(sizeof(*mem_start_ptr))。另外,不要强制转换malloc 的返回值,它在C 中是多余的,甚至可以隐藏错误。 现在,存储这两个 4 字节值:

/* for the first one. Let's use 42 */
*mem_start_ptr = 42;
/* for the second one. Let's put the value of of some variable here */
*(mem_start_ptr + 1) = int_variable;

你应该阅读指针算法。也可能是关于数组的。谷歌是你的朋友。另外,不知道您的代码中的这部分是做什么用的。 因为它没有做你可能期望它做的事情

int data;
data = &mem_start_ptr

最后,我会这样重写你的代码:

int *mem_start_ptr;
mem_start_ptr = malloc(sizeof(*mem_start_ptr));
*mem_start_ptr = your_1st_4bytes;
*(mem_start_ptr + 1) = your_2nd_4bytes;

不要忘记在不再需要它后free()它。另外,我没有在这里拍摄,但也不要忘记检查NULL,因为malloc() 会在失败时返回。

再一次 - 阅读指针算法。谷歌是你的朋友;]

【讨论】:

  • 好的,所以我可以简单地为 *mem_start_ptr 分配一个值,它会自动将该值存储在内存的第一部分。然后我可以遍历它以找出第二部分?
  • @Nelson.b.austin 是的,有点。它的工作方式几乎与数组的工作方式相同。实际上,您甚至可以对第一个使用mem_start_ptr[0],对第二个使用mem_start_ptr[1]。它仍然是完全有效的 && 正确的。不过,您应该真正了解指针算法和动态内存分配。 Google 是你的朋友 =]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多