void *
是一个通用指针,但是呢void **
?是void **
也一个通用的指针?
我们可以强制转换void **
到int **
,char **
等等.
我会感谢堆栈溢出系列的任何信息.
我试图理解C中的堆栈帧,所以我写了一个简单的C代码来分析堆栈帧.
首先,fun1()返回一个局部变量的地址,该地址变量被初始化为10到ptr,这会导致警告但是没关系...如果我打印*ptr的值现在它打印10,即使这很好.. .
接下来fun2()返回一个甚至没有初始化的局部变量的地址,如果我尝试打印*ptr的值,现在它打印10,无论我是否返回a或b的地址...
为了理解这里发生了什么,我使用了gdb.使用gdb,我开始一步一步调试,当我到达fun2()中的" return&a " 行时,我试图打印b的地址,打印&b但是打印 不能取"b"的地址不是一个左值.
我不明白,当我尝试打印a的地址,打印和打印绝对精细,然后为什么不b的地址.*为什么a不是一个左值?
# include <stdio.h>
int * fun1() {
int a = 10;
return &a;
}
int * fun2()
{
int a;
int b;
return &a; // return &b;
}
int main ()
{
int *ptr;
ptr = fun1();
ptr = fun2();
printf ("*ptr = %d, fun2() called...\n", *ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我想将 C 预处理器指令与 shell 脚本一起使用。由于C预处理阶段不编译整个脚本。因此应该可以使用 C 预处理器指令,因为它将被视为脚本的注释。在项目中维护一个包含宏下合并的多个更改的副本也会很有帮助。
这是我为说明而编写的示例代码:
#ifdef HELLO
foo="Hello"
#else
foo="World"
#endif
echo $foo
Run Code Online (Sandbox Code Playgroud)
现在我将此文件另存为testScript.c
并使用 gcc 进行编译
gcc -E testScript.c -o testScript.sh -DHELLO
Run Code Online (Sandbox Code Playgroud)
现在我testScript.sh
和我在一起了。如果我运行这个脚本,我得到的结果是
#ifdef HELLO
foo="Hello"
#else
foo="World"
#endif
echo $foo
Run Code Online (Sandbox Code Playgroud)