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++ 不感兴趣。谢谢!
我只是想知道是否有一些我们可以使用的宏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接口和实现".这个练习题似乎很有趣,无法找到解决方案:
在某些系统上,程序在检测到错误时可以自行调用调试器.当断言失败可能很常见时,此工具在开发期间特别有用.
您能否提供一个关于如何调用调试器的简短示例.
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) 最近参加了MSFT的SDET职位面试。第二轮面试官问我这个问题:给定一个节点值中有一个数字的图,找到所有相连的顶点递增序列的集合。无法回忆确切的问题。这个家伙似乎非常敌对,并且驳斥了我的每一个解决方案。任何人都知道任何这样的问题。最后,解决方案是要有一个邻接矩阵。 。
用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)
我很困惑为什么第二个表达式给出整数溢出警告.
#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) >>> 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.
我在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)