很抱歉问这么愚蠢的问题,但我真的很困惑.
struct Amit
{
int a;
struct Amit *link;
}
*start;
Run Code Online (Sandbox Code Playgroud)
这里既有*link和*start用来指向一个链表的节点,但什么是这两个之间的差异为什么我们不能把*start结构体里面?
我有一段代码这是函数指针的一个例子和.下面是具有回调函数作为其构件的结构已经从Linux内核源取
struct parport_driver {
const char *name;
void (*attach) (struct parport *);
struct parport_driver *next;
};
Run Code Online (Sandbox Code Playgroud)
现在,这些结构的成员在C文件中调用,如下所示
struct parport_driver *drv;
drv->attach(port); /* calling function through implicit dereference */
Run Code Online (Sandbox Code Playgroud)
上面的函数是以隐式方式调用的,但我想知道它将如何被称为显式方式.
解除引用函数指针的隐式和显式方式有什么区别.
我想知道结构成员附加的另一件事应该在调用之前初始化(drv-> attach(port));
喜欢的东西
DRV->附= attach_driver_chain;
其中attach_driver_chain是函数,但我在驱动程序代码中找不到任何这样的初始化.
我正在学习x86上的汇编,并遇到了一个代码,该代码将bss部分归零,其中存储了所有未初始化的变量
;Zero the bss
movw $__bss_start, %di
movw $_end+3, %cx
xorl %eax, %eax
subw %di, %cx
shrw $2, %cx
rep; stosl
Run Code Online (Sandbox Code Playgroud)
但是不确定这段代码是如何工作的.可以有人让我知道这里发生了什么事情,第一条指令是将bss段的地址存储到di寄存器但是最后三条指令的用途是什么?
如果你的编译器实际上优化了每个函数只有两个寄存器变量的访问时间,那么下面程序中哪两个变量最好用于寄存器变量?
void main(void)
{
int i,j,k,m;
do
{
printf("enter value");
scanf(“%d”,&i);
m=0;
for(k=0;k<100;k++)
m=k+m;
}
while(i>0);
}
Run Code Online (Sandbox Code Playgroud)
如果有任何错误,请忽略...
可能的重复:
堆栈增长方向
堆栈是向上还是向下增长?
大家好,
我怎样才能知道机器的堆栈是否在C内存中增长或减少.更重要的是,哪个更好:堆栈增长的系统还是堆栈增长的系统?
以下逻辑工作???
void sub(int *a)
{
int b;
if (&b > a) {
printf("Stack grows up.");
}
else
{
printf("Stack grows down.");
}
}
main ()
{
int a;
sub(&a);
}
Run Code Online (Sandbox Code Playgroud)
我的意思是这个表达式在C中有效
if (&b > a)
Run Code Online (Sandbox Code Playgroud) 我想知道是否可以在不使用Windows上的任何编译器的情况下从.C文件创建.EXE?
我在网站上看到过这段代码,发布此代码的用户想知道这段代码的影响 fflush(stdin).这是下面的代码
main()
{
char *str1="string one";
char *str2="string two";
char charbuf; // store characters in buffer
puts("\nEnter first string");
gets(str1);
fflush(stdin); /*what does this mean here*/
while( (charbuf=getchar() ) != EOF && charbuf!='\n')
; // clear unwanted data
puts("\nEnter second string");
gets(str2);
fflush(stdin);/*what does this mean here*/
while( (charbuf=getchar() ) != EOF && charbuf!='\n')
;
for(;*str1==*str2&(*str1!='\0'||*str2!='\0\);str1++,str2++) ;
{
printf("\nthe string are equal");
}
else
{
printf("\nthe string are not equal");
}
return;
}
Run Code Online (Sandbox Code Playgroud)
但对我来说,在达到fflush(stdin)之前,语句程序员已经犯了一个大错误,即使用get(str1);
可以在这里使用gets(str1)吗?
可能重复:
浮点比较
我有简单的c代码,输出对我来说意外
main()
{
float f1 = 1.0;
double f2 = 1.0;
if(f1==f2)
printf("Equal");
else
printf("unequal");
}
Run Code Online (Sandbox Code Playgroud)
我期待输出"不相等",但输出是相等的.为什么?
由于float和double具有不同的精度,因此输出应该是不相等的.
我有一个C代码,它使用简单的逗号运算符
main()
{
int a= 1,2,3;
printf("%d",a);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我编译得到一个错误,而相同的程序几乎没有修改运行良好
main()
{
int a;
a= 1,2,3;
printf("%d",a);
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我在这里问了一个关于函数指针使用的问题,有人回复给出了经典计算器的例子
float Plus (float a, float b) { return a+b; }
float Minus (float a, float b) { return a-b; }
float Multiply(float a, float b) { return a*b; }
float Divide (float a, float b) { return a/b; }
in some way you select your operation
/* Here there should be an if or a switch/case that selects the right operation */
float (*ptrFunc)(float, float) = Plus;
Run Code Online (Sandbox Code Playgroud)
现在他说"这里应该有一个if或者一个开关/案例选择合适的操作"
并且已经多次读取函数指针可以用来替换if或switch/case语句但是不能理解(即使在这个计算器例子中)函数指针如何替换if或switch/case?
任何人都可以帮助我如何可视化功能指针替换if或switch/case.