我正在处理一个现有的c项目(sourceforge上的spglib),我在清理了一些数组初始化后遇到了以下问题:
*检测到glibc* tests/spglibtest:free():下一个大小无效(快):0x08ab46e0***
回溯是:
#0 0xb7fe1424 in __kernel_vsyscall ()
#1 0xb5cfdd61 in raise () from /lib/libc.so.6
#2 0xb5cff5ee in abort () from /lib/libc.so.6
#3 0xb5d397ed in ?? () from /lib/libc.so.6
#4 0xb5d3f7b1 in ?? () from /lib/libc.so.6
#5 0xb5d4052b in ?? () from /lib/libc.so.6
#6 0xb5d441cd in free () from /lib/libc.so.6
#7 0xb6681484 in sym_get_multiplicity (cell=0xbfffe1f0, symprec=0.050000000000000003) at /git/xtalopt-public/src/spglib/symmetry.c:168
#8 0xb6680550 in spg_find_primitive (lattice=0xbfffe2a8, position=0x813c6f0, types=0x813c700, num_atom=2, symprec=0.050000000000000003)
at /git/xtalopt-public/src/spglib/spglib.c:253
Run Code Online (Sandbox Code Playgroud)
错误发生在下面的"免费(反式)"行中:
int sym_get_multiplicity(const Cell *cell, const double symprec)
{
int …Run Code Online (Sandbox Code Playgroud) 它是否实际上逐个字符地读取或者是否将某些字节读入内核缓冲区并按字符返回到用户字符?
和它一样fgets吗?
让我说我使用glibc和gcc编译器.
我需要编译时间检查将使用哪个版本的glibc.
我可以找到唯一的编译时检查(即#defines)返回glibc日期(__ GLIBCXX__),日期和版本之间的对应似乎是iffy.如何在编译时检查将使用的glibc版本?
我的代码将在几个系统上编译和运行,包括一个非常旧的系统.特别是我对使用malloc_info感兴趣(参见http://man7.org/linux/man-pages/man3/malloc_info.3.html).这是在2.10版本中添加到glibc中的.该程序将在其构建的相同(或相同的系统)上使用.
在GNU C Library Reference Manual中,有一个示例程序(p.65),但我不知道这三个句子__malloc_hook = old_malloc_hook;
old_malloc_hook = __malloc_hook;
__malloc_hook = my_malloc_hook;
是什么
意思.特别是第二个,谁能为我解释一下?谢谢.
static void *
my_malloc_hook (size_t size, const void *caller)
{
void *result;
/* Restore all old hooks */
__malloc_hook = old_malloc_hook;
__free_hook = old_free_hook;
/* Call recursively */
result = malloc (size);
/* Save underlying hooks */
old_malloc_hook = __malloc_hook;
old_free_hook = __free_hook;
/* printf might call malloc, so protect it too. */
printf ("malloc (%u) returns %p\n", (unsigned int) size, result); …Run Code Online (Sandbox Code Playgroud) 我正在使用Linux(ubuntu)。
我想阅读一些在头文件中声明的函数的函数定义,例如 stdlib.h
我尝试寻找,stdlib.c但找不到。
谁能告诉我在系统上哪里可以找到相应的代码文件。
如果我太天真,请原谅我。谢谢
我很好奇epoll_wait()如何接收已注册的套接字(带有epoll_ctl())已准备好进行读/写的事件.
我相信glibc神奇地处理它.
那么,是否有一个文档描述了如何为套接字触发以下事件?
PS最初我试图在我的盒子上将enum EPOLL_EVENTS粘贴到我的盒子里; stackoverflow认为我没有正确格式化代码块,虽然我用pre和then代码标签包装它,任何想法?
当我尝试从终端编译这个简单的代码时:
#include<stdio.h>
int main(void)
{
printf("%f\n",sqrt(10));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运用
gcc main.c
命令,它被编译,a.out给出正确的答案.这意味着数学函数被添加到C标准库中,它自动链接.
但是如果在Eclipse IDE中编译相同的代码而不向属性添加任何库,则会给出未定义的引用错误.这意味着数学函数不是C标准库的一部分.
真相是什么?
我正在阅读glibc的源代码,我发现它有两个具有相同名称的宏.
这一个在105行
#define L_(Str) L##Str
,这就在130行
#define L_(Str) Str
这些宏到底意味着什么?用法仅用于比较两个字符
.例如,在第494行,您可以看到它用于比较*f和'$'之间的字符值
if(*f == L_('$')).如果我们想比较两个字符,我们可以直接比较它们,而不是通过宏指导它们?另外,第105行宏的用例是什么?
他们都可以根据我的测试更改文件大小。他们为什么都可以将文件更改为更大和更短?fallocate和ftruncate有什么区别?
我编写了一个简单的代码进行测试prof。
double bar_compute (double d) {
double t = std::abs(d);
t += std::sqrt(d);
t += std::cos(d);
return t;
}
// Do some computation n times
double foo_compute(unsigned n) {
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(0.0, 1.0);
double total = 0;
for (int i=0; i<n; i++) {
double d = dist(mt);
total += bar_compute(d);
}
return total;
}
Run Code Online (Sandbox Code Playgroud)
当我运行prof并查看输出时,它是
56.14% runcode libm-2.23.so [.] __cos_avx
27.34% runcode runcode [.] _Z11foo_computej
13.92% runcode runcode [.] _Z11bar_computed
0.86% runcode libm-2.23.so …Run Code Online (Sandbox Code Playgroud)