C 程序的输出 |设置 3
预测以下程序的输出。
问题 1
c
#include
int main()
{
printf("%p", main);
getchar();
return 0;
}
c
#include
int main()
{
printf("\new_c_question\by");
printf("\rgeeksforgeeks");
getchar();
return 0;
}
c
# include
# include
void fun(int *a)
{
a = (int*)malloc(sizeof(int));
}
int main()
{
int *p;
fun(p);
*p = 6;
printf("%d\n",*p);
getchar();
return(0);
}
c
#include
int main()
{
int i;
i = 1, 2, 3;
printf("i = %d\n", i);
getchar();
return 0;
}
c
#include
int main()
{
int i;
i = (1, 2, 3);
printf("i = %d\n", i);
getchar();
return 0;
}
c
#include
int main()
{
int first = 50, second = 60, third;
third = first /* Will this comment work? */ + second;
printf("%d /* And this? */ \n", third);
getchar();
return 0;
}
输出:函数main 的地址。
说明:函数的名称实际上是一个指针变量的函数和打印函数的地址。符号表是这样实现的。
struct
{
char *name;
int (*funcptr)();
}
symtab[] = {
"func", func,
"anotherfunc", anotherfunc,
};
问题2
C
#include
int main()
{
printf("\new_c_question\by");
printf("\rgeeksforgeeks");
getchar();
return 0;
}
输出:geeksforgeeks
解释:首先 printf 打印“ew_c_questioy”。第二个 printf 中有 \r 所以它回到行首并开始打印字符。
现在尝试在不使用任何转义字符的情况下打印以下内容。
new c questions by
geeksforgeeks
问题 3
C
# include
# include
void fun(int *a)
{
a = (int*)malloc(sizeof(int));
}
int main()
{
int *p;
fun(p);
*p = 6;
printf("%d\n",*p);
getchar();
return(0);
}
这是行不通的。尝试替换“int *p;”与“int * p = NULL;”它将尝试取消引用空指针。
这是因为 fun() 对指针进行了复制,因此在调用 malloc() 时,它将复制的指针设置为内存位置,而不是 p。 p 在调用 fun() 之前和之后指向随机内存,当您取消引用它时,它会崩溃。
如果要从函数向指针添加内存,则需要传递指针的地址(即双指针)。
感谢 John Doe 提供正确的解决方案。为了更好地理解,请访问以下链接:https://stackoverflow.com/questions/1398307/how-can-i-allocate-memory-and-return-it-via-a-pointer-parameter-to-the-打电话
问题 4
C
#include
int main()
{
int i;
i = 1, 2, 3;
printf("i = %d\n", i);
getchar();
return 0;
}
输出:1
上面的程序打印 1. 逗号运算符是从左到右的,但 =运算符的优先级高于逗号运算符。
因此,语句 i = 1, 2, 3 被编译器视为 (i = 1), 2, 3。
现在应该很容易判断下面程序的输出了。
C
#include
int main()
{
int i;
i = (1, 2, 3);
printf("i = %d\n", i);
getchar();
return 0;
}
问题 5
C
#include
int main()
{
int first = 50, second = 60, third;
third = first /* Will this comment work? */ + second;
printf("%d /* And this? */ \n", third);
getchar();
return 0;
}
输出:110 /* 还有这个? */
解释:如果“/*”和“*/”之间不存在双引号(“”),编译器会删除它们。