小编Shi*_*sui的帖子

指针比较在 C 中如何工作?可以比较不指向同一个数组的指针吗?

在 K&R(C 编程语言第 2 版)第 5 章中,我阅读了以下内容:

首先,在某些情况下可以比较指针。如果pq指向同一个数组的成员,则关系一样==!=<>=,等正常工作。

这似乎意味着只能比较指向同一数组的指针。

但是,当我尝试此代码时

    char t = 't';
    char *pt = &t;
    char x = 'x';
    char *px = &x;

    printf("%d\n", pt > px);
Run Code Online (Sandbox Code Playgroud)

1 被打印到屏幕上。

首先,我认为我会得到 undefined 或某种类型或错误,因为ptpx没有指向同一个数组(至少在我的理解中)。

也是pt > px因为两个指针都指向存储在栈上的变量,栈向下增长,所以内存地址t大于x?为什么pt > px是真的?

当 malloc 被引入时,我变得更加困惑。 同样在第 8.7 章的 K&R 中写到以下内容:

然而,仍然存在一种假设,即sbrk可以有意义地比较指向由 返回的不同块的指针。仅允许在数组内进行指针比较的标准并不能保证这一点。因此,这个版本的malloc仅在一般指针比较有意义的机器之间是可移植的。

将指向堆上 malloced …

c pointers heap-memory memory-layout undefined-behavior

35
推荐指数
3
解决办法
5731
查看次数

OpenCV 的 getGaussianKernel 方法的 sigma 公式来自哪里?

我注意到在 OpenCV 文档中getGaussianKernelsigma是使用以下公式计算的:

sigma = 0.3*((ksize-1)*0.5 - 1) + 0.8 
Run Code Online (Sandbox Code Playgroud)

这个公式从何而来?这只是 OpenCV 作者提出的一些近似值吗?

opencv image-processing gaussianblur

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

Reverse Integer leetcode:为什么只有将 7 或更大的值添加到 INT_MAX 才会发生溢出?

我有 Leetcode 提供的解决方案,让我困惑的部分是将 7(或更低的值)添加到 Integer.MAX_VALUE 或将 -8(或更低的值)添加到 Integer.MIN_VALUE 不会导致溢出或下溢分别。

我的逻辑是,如果你有 Integer.MAX_VALUE,加 1 会导致溢出。如果您有 Integer.MIN_VALUE,减 1 将导致下溢。我对溢出和下溢的理解错误在哪里?

class Solution {
    public int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || (rev ==     Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + …
Run Code Online (Sandbox Code Playgroud)

java

4
推荐指数
2
解决办法
377
查看次数

char *a[]={"hello", "world"}; 和有什么区别?和字符 a[][10]={"hello", "world"};?

当我尝试这段代码时

char *a[] = {"hello", "world" };
char **p = a;
char a[][10]={"hello", "world"};
Run Code Online (Sandbox Code Playgroud)

我的编译失败,我被告知变量 a 存在冲突类型错误。顶部声明与底部声明有何不同?

c arrays pointers declaration implicit-conversion

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

删除节点时,为什么不必将该节点的下一个设置为null?

我注意到,很多在线的代码仅针对删除节点或删除节点功能,LinkedList只是将上一个节点的下一个设置为要删除的下一个节点。但这不是一个不完整的删除,因为删除的节点仍指向下一个吗?

例如

A-> B-> C

如果删除B,则应A指向C。但是,如果您不B指向null,就不B存在,因为它指向的是C

同样明智的是,对于Java中的双链表,如果要删除节点,是否不需要确保该节点不再指向任何要真正删除的节点?

java linked-list singly-linked-list

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

使用 time.Now().Unix()、UnixNano()、UnixMilli() 等是否安全?整数溢出怎么办?

我在这里读到Unix() 返回的https://pkg.go.dev/time#Unixthe local Time corresponding to the given Unix time, sec seconds and nsec nanoseconds since January 1, 1970 UTC

您还可以分别使用 UnixNano() 和 UnixMilli() 获取自 1970 年以来的毫秒数或纳秒数。

我想我对这如何安全感到困惑。如果纳秒、毫秒或常规秒的数量超过 int64 的容量,是否会出现日期/时间中断?

另外,我在 go Playground https://go.dev/play/上进行了实验,通过打印出来time.Now.Unix(),我总是会得到 1257894000 秒,即使我运行代码的时间间隔大约是一分钟。

然而,如果我这样做的话,我确实看到了不同

time.Now.Unix()
time.Sleep(time.Duration(1) * time.Second)
time.Now.Unix()
Run Code Online (Sandbox Code Playgroud)

这给了我 1257894000 和 1257894001。

我很困惑 Unix 时间基本上是如何工作的。

go unix-timestamp

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