【问题标题】:General question regarding allocating memory for an integer in C关于在 C 中为整数分配内存的一般问题
【发布时间】:2023-03-13 08:29:01
【问题描述】:

我目前正在学习 C 中的动态内存分配,但对某个特定概念有困难。为了将 malloc 用于特定整数,我需要在该空间内放置一个先前声明的整数。

以下是我作为代码输入的内容。

void example(int ab)
{
int* intPtr=(int*)malloc(sizeof(int));
*intPtr = &ab;
}

我不想运行程序或任何东西。我只是想看看我是否对一些基本的内存分配有正确的想法。

【问题讨论】:

  • 没有必要对malloc() 进行类型转换,因为它是由编译器隐式完成的。阅读Do I cast the result of malloc?。这个int* intPtr = malloc(sizeof(int)); 很好。
  • ab 在堆栈上已经有一个空间,在 C 内存中,局部变量在堆栈上分配了一个静态时间,根据 Sack 指针的偏移量。您可以阅读 C 中用于静态内存分配的存储类。您也不能在运行时更改 c 中任何变量的地址。
  • 这是真的我已经了解了堆栈以及如何分配局部变量。因此,如果我假设在这种情况下声明一个新变量,我会这样做:*intPtr=int x?

标签: c memory malloc


【解决方案1】:

有几个问题,首先它不需要对malloc() 的结果进行类型转换,因为它是由编译器隐式完成的。 Read Do I cast the result of malloc?。这个

int* intPtr = malloc(sizeof(int)); /* or even malloc(sizeof(*intPtr)); is better */

没问题。

其次,这个

*intPtr = &ab; /* *intPtr means value at allocated dynamic address, you should assign the value not address of ab*/

错了,*intPtr 是动态地址的值,编译器应该警告你喜欢

main.c:7:9: 警告:指向整数的指针不兼容 从“int *”分配给“int”的转换; 删除和 [-Wint-转换]

如果您使用以下标志编译,例如

gcc -Wall -Wextra -Werror -Wpedantic test.c

应该是

*intPtr = ab;

此外,您没有释放动态分配的内存,这会导致内存泄漏。使用完毕后调用free() 释放动态分配的内存。

旁注,如果您打算这样做

intPtr = &ab; /* Before this statement intPtr was pointing dynamic memory(heap), but now that gets overwritten with stack allocated space */

然后您用堆栈创建的内存(即局部变量的地址)覆盖动态内存,在这种情况下,您正在丢失动态内存,因为没有任何东西指向先前分配的动态地址。

【讨论】:

  • 谢谢,这消除了我的一些误解。我也在进行类型转换,因为我阅读了一些在使用 malloc 时进行类型转换的先前示例。我会阅读您在上面发布的资源。
  • @NoobCoder:在 1989 年标准之前,malloc 返回 char *,因此如果您想将结果分配给不同的指针类型,则需要强制转换 。 '89 标准将 malloc 更改为返回 void *,可以将其分配给其他指针类型而无需强制转换。在 C++ 中情况并非如此,它不允许在 void * 和其他指针类型之间直接赋值。
猜你喜欢
  • 2021-08-27
  • 1970-01-01
  • 2012-09-30
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2021-06-15
  • 2020-07-15
相关资源
最近更新 更多