一个奇怪的C语言问题,涉及到指针、数组、堆栈、以及printf,希望C语言大神们帮帮忙。

作者&投稿:桂纪 (若有异议请与网页底部的电邮联系)
c语言问题 百万富翁大神们帮帮忙~

#include #include void main() { int m; printf("input:
"); scanf("%d",&m); m = m*100; int s = 0; int count = 0; int n = 1; while( s<=m ) { s += n; count++; n *= 2; } printf("
%d
",count); getch(); }

int GetLine(char*str[],int maxLine); // 定义的是二级指针(形参数组退化为了指针)
调用的时候用一级指针while((length=GetLine(line,MAXLINE))>0)明显不对啊

刚才我也没想明白,看到了dripple11的回答,再去想了一下,现在想明白了。他的回答是正确的。

又回头看了一下,发现,lz没有完全搞懂。
顺便鄙视一下whatplay的回答,是个傻X。

printf函数,正如第一个人所说,调用函数printf前先要将形参压栈,这时候要计算*p
所以,第一条printf语句已经把参数算出来并放到栈顶保存了。然后调用printf函数(函数调用需要用到栈建立访问连和控制链,而,原来的函数f执行完了,原本f是在栈顶的,所以,函数f的栈空间释放。数组空间也被释放),printf占用了栈,所以,把原来函数f的栈空间内容修改了。所以,第一条printf语句是可以得到结果的。后面因为arr空间的内容已经被修改,所以,之后的printf语句都得不到结果。

顺便再解释一下printf("%s\n",p);得到的为什么是乱码。
正如上面所说,先计算参数p的值保存栈顶。保存的值为arr的地址。然后调用printf函数,把栈顶空间内容修改了。虽然保存了地址,但是原来的内容已经修改了,所以得不到结果。

whataplay,我只是鄙视你的回答,没有骂你。因为你的回答是答非所问!

都说得啥呀这是,与printf有啥关系?!请不懂的不要误导。这是很简单也是比较典型的局部变量问题。你可以调试一下,编译器会返回以下信息: warning C4172: returning address of local variable or temporary
指的是你返回了 f() 这个函数的局部临时变量;关键问题是,一旦函数返回,那么它所有的局部变量都会被释放,因此 f() 返回时,它的局部变量 arr[] 同样会被释放,此时arr[] 已经不存在了,返回当然错误。(可以返回头一个,比如这个例子arr[0];需要指出的是,返回单个变量这么做是可行的,不过数组就行不通了 )。所以“返回函数的局部数组变量”这是个错误的方式,要克服。
解决方法:1. 将arr申请为静态变量,static char arr[]="hello"; 这样函数反回时静态变量arr就不会被释放了。或者动态申请内存 char *arr= new char [100]; arr = "hello"; 或者干脆 char *arr="hello"; 100表示尽量大一些。打印时候别加星 printf("%s\n", p);
2. 将p在函数外部申请
void f(char *arr)
{
sprintf(arr, "%s", "hello");
}
void main()
{
char p[100];
f(p);
printf("%s\n", p);
}
推荐这一种,说得是最好在函数外面把内存申请工作做好,在函数里面申请的内存只管函数里面的运算作用,最好不要针对外面。希望你通过这个例子对规范化编程有进一步的认识。
请骂我的人放尊重一点,我都编程这么多年了,这个问题不可能弄不明白,谢谢。

printf函数里面使用了堆栈,打印后将原有堆栈内容破坏

printf也是函数,第一个printf调用导致参数压栈,hello被冲掉了

请 dripple11 高手详细解答,学习了!~

c语言弱智问题(逻辑运算),求解释。
答:乍一看,蒙了,仔细一想,A项好奇怪。C语言中表示数据范围的话,并没有连写的。答案是 A,相当于 (10<a)<15, 10<a 的结果是布尔值,不是 0 就是1 ,无论是哪个都比 15 小,所以 10<a<15 的结果为 true,是确定值。

c语言遇到了一个奇怪的现象!
答:printf("请用户输入要查询元素的行数呵列数\n")你这一句小括号的左边部分用成了中文符号,而且这一句结尾没有加 分号 ;2. scanf("%d,%d",&i,&j);你的输入函数定义的输入规则是 "%d,%d",所以输入这两个整数的时候,中间必须加逗号 ,才符合你的输入规则。如上图,就是你的程序结果。

C语言中奇怪的“^”问题
答:这是异或运算,看一下书,或网上搜索。10: 00001010 2 : 00000010 00001000 第一、二行分别是10和2的二进制表达形式。第三行是结果。按位异或的意思是说,同一位中,如果相等则为0,不相等则为1。

c语言求助,书上这个题很奇怪。
答:可能是网页代码受到限制的原因,你的书写格式很乱。我重新给你整理了一下。多年来用C语言,经过多种格式的比较,我一直使用下面这种括号配对方法,很少出错。经过配对,明显可以看出少了一个大括号。那3个warning 是书写格式造成的编译警告,不影响结果。include<stdio.h> void main(){ int a=2,b=7...

C语言一个奇怪的问题!!
答:估计因为你多打了空格,在i之前,具体为什么多个空格就成了a,有待考证 此外,我的编译器并没有输出。。。

c语言答案奇怪题
答:哎 我想没的人愿意看你这个题 没有一点好的程序风格 lz写程序最重要的是风格啊 不然到时候你自己就看不到 没心情看。define N 10 include <stdio.h> void main(){ int a[N],i,s,t,n,p;printf("请输入0--10间一个正整数:\n");scanf("%d",&n);printf("请输入%d个整数:\n",n);...

C语言编程 算数出现奇怪的问题
答:语句去掉printf()才是正确的 你这个有两个条件,一个是被三整除,一个是要有三这个数字 而自定义函数必须要有返回值,返回值有两种形式,一种是return语句,一种是碰到printf语句也是返回值 所以,加了printf,则函数到这里就调用结束,所以选的只是被3整除的,总数有3000个,而去掉了printf,则后面的...

C语言程序题目,为什么我的答案这么奇怪的
答:在x<0、x=1、x=1时,也需要给y赋值,否则你递归调用函数时总会遇到这种情况,没有返回值是有问题的。建议:改int y;为int y=1;

C语言的一些奇怪的表现,求高人指点。
答:之后通过屏幕输入的内容实际为一个整数+一个换行符,儿scanf只读取了一个整数,而换行符依旧存在缓冲区中。gets函数会读取字符知道遇到换行符,对于当前的情况来说,其第一个字符就是换行符,所以,它只读取一个换行符。gets函数在执行完读取操作之后,会将换行符转换为\0,这也就是我们为什么看不到内容...

c语言难题,求助啊
答:觉得第5题还有点好玩,所以做了个.应该没问题的./*验证谷角猜想。日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数n,若n为偶数,则将其除以2;若n为奇数,则将其乘以3,然后再加1。如此经过有限次运算后,总可以得到自然数1。人们把谷角静夫的 这一发现叫做“谷角...