我正在阅读" Linux设备驱动程序,第3版 ",并发现了一些我无法理解的东西.
在第3.2章中,作者说:
传统上,主要编号标识与设备关联的驱动程序.内核使用次要编号来确定要引用的设备.
然后我尝试了"ls -l/dev"来看一看,我发现有些不寻常:
brw-rw---- 1 root disk 1, 1 2011-08-23 23:52 ram1
brw-rw---- 1 root disk 1, 2 2011-08-23 23:52 ram2
brw-rw---- 1 root disk 1, 3 2011-08-23 23:52 ram3
brw-rw---- 1 root disk 1, 4 2011-08-23 23:52 ram4
brw-rw---- 1 root disk 1, 5 2011-08-23 23:52 ram5
...
crw-r----- 1 root kmem 1, 1 2011-08-23 23:52 mem
crw-r----- 1 root kmem 1, 4 2011-08-23 23:52 port
crw-rw-rw- 1 root root 1, 3 2011-08-23 23:52 null …Run Code Online (Sandbox Code Playgroud) 我被困在这里......
#include <stdio.h>
#define DBG_LVL(lvl, stmt) \
do{ \
if(lvl>1) printf stmt; \
}while(0)
#define DBG_INFO(stmt) DBG_LVL(1, stmt)
#define DBG_ERROR(stmt) DBG_LVL(2, stmt)
int main()
{
DBG_INFO(("hello, %s!\n", "world"));
DBG_ERROR(("crazy, %s!\n", "world"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,上面的代码使用"DBG_INFO"或"DBG_ERROR"等宏来控制调试信息级别.
现在由于某种原因,我必须DBG_LVL()用新功能替换.
void myprint(int lvl, const char * format, ...);
Run Code Online (Sandbox Code Playgroud)
唯一的区别是调试级别被视为其fisrt参数.我刚在想:
#define DBG_LVL(lvl, stmt) myprint(lvl, stmt)
Run Code Online (Sandbox Code Playgroud)
当然它失败了,因为"stmt"表达式包括括号.然后我用Google搜索试图找到剥离括号的方法,似乎没有什么可以帮助.我也尝试了一些技巧将参数传递给"stmt",仍然失败...... :(
你能帮助我吗?
我写了一个小程序来打印给定字母集的完整排列.当集合小于26时它运行良好,并且在26或更多时崩溃.崩溃日志说:
*** Error in `./a.out': malloc(): memory corruption (fast): 0x0000000000cd56a0 ***
Run Code Online (Sandbox Code Playgroud)
经过几个小时的调试,仍然不知道根本原因.
PS:如果我删除了释放tmp_done和tmp_todo的这两行,它就不会崩溃,但结果仍然很奇怪,一个意外的"!" 发生在结果中.
abcdefghijklmnopqtyuzxwr!sv
abcdefghijklmnopqtyuzxwr!vs
abcdefghijklmnopqtyuzxws!rv
abcdefghijklmnopqtyuzxws!vr
abcdefghijklmnopqtyuzxwv!rs
Run Code Online (Sandbox Code Playgroud)
这是来源:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>
static void __permutation1(char * done, char * todo)
{
int i = 0;
for(i=0; i<strlen(todo); i++)
{
if (1 == strlen(todo))
{
printf("%s%s\n", done, todo); break;
}
char * tmp_todo = strdup(todo);
char * tmp_done = strdup(done);
char s[2] = {todo[i], 0};
strcat(tmp_done, s);
memmove(tmp_todo+i, tmp_todo+i+1, strlen(tmp_todo)-i); // null termincated!
__permutation1(tmp_done, tmp_todo); …Run Code Online (Sandbox Code Playgroud)