【问题标题】:memory allocation in c when casting returned value to pointer将返回值转换为指针时c中的内存分配
【发布时间】:2019-09-01 07:24:45
【问题描述】:

在 c 中, 当定义像int a; int* b; 这样的变量时,内存是在堆栈中分配的。 使用 malloc 时,使用堆内存。

我的问题是,如果在如下函数中:

void* function () {
int counter = 0;
while() {
   ... does some counting
   counter++;
}
return (void *) counter;
}

它返回一个指向计数器的指针,计数器的内存在哪里?代码段?

【问题讨论】:

  • 它没有返回指向counter 的指针。它将counter 的值转换为void *。这将是一个无效的指针,因为它的任何使用都会产生未定义的行为。所以它不必“生活”在内存中的任何地方。

标签: c memory-management


【解决方案1】:

它没有返回指向counter 的指针。那将是&counter,它是一个指向局部变量的指针。这样做会出错,因为局部变量会在函数返回后立即销毁,因此调用者将得到一个指向不再存在的事物的指针。

实际上,counter 可能存在于堆栈或一个寄存器(或多个寄存器)中。代码段通常是只读的,因此变量不能存在。

(void *)counter 正在将数字转换为指针值。该操作的结果是实现定义的。

例如,gcc:

如果指针表示小于整数类型,则从整数到指针的转换丢弃最高有效位,如果指针表示大于整数类型,则根据整数类型的符号进行扩展,否则位不变.

结果地址可能根本不是一个有效的指针值,或者它可能指向一个未映射的页面。

【讨论】:

  • (void*) 1 只是一个例子,让我把它改成更有意义的东西
  • 代码肯定可以编译,这就是pthread_join和pthread_exit的工作原理。
  • @JunbangHuang 我说&1 无法编译。
  • 标准中“未定义”的定义包括很多东西,包括“不需要诊断”。
猜你喜欢
  • 1970-01-01
  • 2012-02-02
  • 2011-08-02
  • 2010-09-30
  • 2022-11-21
  • 1970-01-01
  • 2018-08-11
  • 2016-02-21
  • 1970-01-01
相关资源
最近更新 更多