小编old*_*959的帖子

为什么在C允许的函数中返回堆栈分配的指针变量?

我已阅读以下帖子:

从函数返回堆分配的指针可以吗?

这表明返回了指向堆分配变量的指针。但是,指针在技术上是否是“堆栈分配的变量”,则在返回函数时将释放该指针?

例如:

int* test(){
  int arr[5];
  int *ptr = arr;

  return ptr; //deallocated ptr?
}

int *test2(){
  int arr[5];

  return arr;
}
Run Code Online (Sandbox Code Playgroud)

在测试中

另外,说arr是指向某个新创建的int数组arr的指针是正确的&arr[0]。如果arr不是指针,为什么返回满足函数返回类型的有效指针?

由于ptr和arr都应该是堆栈分配的,为什么代码只能在其中工作test()而不能test2()?test()是否给出未定义的行为?

c return-value lifetime

4
推荐指数
1
解决办法
293
查看次数

为什么在搜索密钥时只有O(1)时间的哈希表查找是O(n)?

从技术上讲,根据我在这里读到的帖子,哈希表在最坏的情况下确实是O(n)时间查找.但我不知道内部机制如何保证它平均为O(1)时间.

我的理解是,给定n个元素,理想情况是有n个桶,这导致O(1)空间.这就是我被困住的地方.假设我想查找一个键是否在字典中,这肯定需要O(n)时间.那么,当我想通过使用其键的哈希值来搜索元素是否在哈希表中时,为什么会有所不同呢?简而言之,使用原始键值进行搜索会得到O(n)时间,但使用哈希值时会得到O(1)时间.这是为什么?

难道我还不需要逐个查找哈希值来查看哪一个匹配?为什么哈希让我立即知道要检索哪个元素或者是否存在这样的元素?

algorithm hash hashmap

3
推荐指数
2
解决办法
1989
查看次数

如何打印数组数组?

虽然我已经检查过如何打印数组的上一个答案,但我仍然卡在打印阵列数组中.在OCaml中,我不能用功能性的方式来解决这个问题.

Ocaml:打印出int列表数组中的元素

假设我有一个数组数组.我该如何简单地打印这个数组?

mutable ch               : t array array;
Run Code Online (Sandbox Code Playgroud)

printing arrays ocaml

1
推荐指数
1
解决办法
533
查看次数

为什么我的while循环不会以这种函数式语言终止?

我正在尝试使用命令式和功能性概念构建标准ML程序,并将内容写入文件.但我的while循环似乎没有终止,而是连续打印相同的值.

fun writeImage image filename =

  let val ap = TextIO.openOut filename

      val (w,h) = size image

      val row = ref 0

      val stringToWrite = "";

  in

    while !row < h do

        TextIO.output(ap,"A");

        row := !row + 1;

     TextIO.closeOut ap

  end;  
Run Code Online (Sandbox Code Playgroud)

如果我在while循环之后删除第一行,则循环终止.但如果我包括TextIO.output(ap,"A");,它就没有.为什么会这样?

arrays algorithm functional-programming sml smlnj

-1
推荐指数
1
解决办法
339
查看次数

为什么小于1的最大IEEE浮点可表示数字与机器epsilon的一半相差?

我们可以将1.0表示为2 ^ 0 x 1.0,将小于1.0的最大可表示数表示为k,其中k = 2 ^ 0 x 0.111 ....... 1截断为拟合.

然后差值或ulp为1.0 - k = 2 ^ 0 x 0.00000 ..... 1.

与机器epsilon不同,我们有N epsilon = 2 ^ 0 x 1.000000 .... 1 - 2 ^ 0 x 1.000 = 2 ^ 0 x 0.000 ..... 1?

为什么正确的值是一半?

另外,如何计算除1.0以外的值的ulp?

floating-point numerical-methods

-5
推荐指数
1
解决办法
159
查看次数