小编use*_*645的帖子

完美哈希函数?

在阅读Wikipedia上的鸽子原理时,我遇到了 - "哈希表中的冲突是不可避免的,因为可能的键数超过了数组中索引的数量.没有哈希算法,无论多么聪明,都可以避免这些冲突".但是gperf不是这样做的吗?

请指教.

hash perfect-hash gperf

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

在 x86-64 上被认为是原子的 C 程序中分配一个指针

https://www.gnu.org/software/libc/manual/html_node/Atomic-Types.html#Atomic-Types说 -在实践中,你可以假设 int 是原子的。你也可以假设指针类型是原子的;那很方便。这两个假设在 GNU C 库支持的所有机器上和我们知道的所有 POSIX 系统上都是正确的。

我的问题是,对于使用 gcc m64 标志编译的 C 程序,是否可以将指针分配视为 x86_64 架构上的原子分配。操作系统为 64 位 Linux,CPU 为 Intel(R) Xeon(R) CPU D-1548。一个线程将设置一个指针,另一个线程将访问该指针。只有一个写入线程和一个读取线程。Reader 应该获取指针的先前值或最新值,并且两者之间没有垃圾值。

如果它不被认为是原子的,请让我知道我如何使用 gcc 原子内置函数或者像 __sync_synchronize 这样的内存屏障来实现相同的效果而不使用锁。只对 C 解决方案感兴趣,对 C++ 不感兴趣。谢谢!

c multithreading gcc x86-64 atomic

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

通过宏修改printf()以包含文件和行号信息

我只是想知道是否有一些我们可以使用的宏hack来改变项目中现有的printf()语句.

/* file.c */
printf ("%s", strerror(errno));

/* After macro processing, this line would become */
printf ("%s %s %d", strerror(errno), __FILE__, __LINE__);
Run Code Online (Sandbox Code Playgroud)

c

6
推荐指数
3
解决办法
3万
查看次数

从C程序中调用调试器

我正在读大卫汉森的书"C接口和实现".这个练习题似乎很有趣,无法找到解决方案:

在某些系统上,程序在检测到错误时可以自行调用调试器.当断言失败可能很常见时,此工具在开发期间特别有用.

您能否提供一个关于如何调用调试器的简短示例.

void handle_seg_fault(int arg)
{
    /* how to invoke debugger from within here */
}

int main()
{
    int *ptr = NULL;
    signal(SIGSEGV, handle_seg_fault);
    /* generate segmentation fault */
    *ptr = 1;
}
Run Code Online (Sandbox Code Playgroud)

c linux gdb systems-programming

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

图中节点的最长增加顺序

最近参加了MSFT的SDET职位面试。第二轮面试官问我这个问题:给定一个节点值中有一个数字的图,找到所有相连的顶点递增序列的集合。无法回忆确切的问题。这个家伙似乎非常敌对,并且驳斥了我的每一个解决方案。任何人都知道任何这样的问题。最后,解决方案是要有一个邻接矩阵。 。

algorithm

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

计算C程序中的最大int值(1 << 31) - 1

用gcc(4.6.3)编译它不会产生警告,结果产生-2147483648.

printf ("%d", (1<<31));
Run Code Online (Sandbox Code Playgroud)

编译它会产生"警告:表达式中的整数溢出[-Woverflow]"并产生2147483647作为结果.

printf ("%d". (1<<31)-1);
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么第二个表达式给出整数溢出警告.

c

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

使用数组创建单链接列表时出现警告

#include <stdio.h>

typedef struct
{
  int data;
  struct node *next;
}node;

void print(node *head)
{
  node *tmp = head;
  while (tmp)
  {
    printf ("%d ", tmp->data);
    tmp = tmp->next;
  }
}

int main()
{
  node arr[5] = {
                  {1, &arr[1]},
                  {2, &arr[2]},
                  {3, &arr[3]},
                  {4, &arr[4]},
                  {5, NULL}
                };

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

为什么在使用gcc -Wall编译时会收到这些警告?(即使没有-Wall,gcc会产生相同的警告)

list.c: In function ‘print’:
list.c:15:7: warning: assignment from incompatible pointer type [enabled by default]
list.c: In function ‘main’:
list.c:22:18: warning: initialization from incompatible pointer type …
Run Code Online (Sandbox Code Playgroud)

c arrays typedef linked-list

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

无法理解浅拷贝

>>> a = [1,2,3]
>>> b = a[:]
>>> id(a[0]) == id(b[0])
True
>>> b[0] = 99
>>> id(a[0]) == id(b[0])
False
Run Code Online (Sandbox Code Playgroud)

我理解,为了制作浅色副本,我们可以使用切片,还有一个复制模块.但是为什么写入"b"索引会改变id.

python deep-copy shallow-copy

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

在函数调用中使用*运算符

我在random.randint()中使用*感到困惑,找不到任何文档

random.randint( *(1,300) )
Run Code Online (Sandbox Code Playgroud)

random.randint( 1,300 )

random.randint( *300 )
TypeError: randint() argument after * must be a sequence, not int
Run Code Online (Sandbox Code Playgroud)

python

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