
一个C语言问题!困惑好久了!求解惑! 50
为什么这样能给*i赋值,并能够打印出来#include<stdio.h>intmain(){int*i;chara;scanf("%d",i);printf("%d",*...
为什么这样能给*i赋值,并能够打印出来
#include<stdio.h>
int main(){
int *i;
char a;
scanf("%d",i);
printf("%d",*i);
return 0;
}
而下面这种却不行呢?困惑求解!
#include<stdio.h>
int main(){
char a;
int *i;
scanf("%d",i);
printf("%d",*i);
return 0;
} 展开
#include<stdio.h>
int main(){
int *i;
char a;
scanf("%d",i);
printf("%d",*i);
return 0;
}
而下面这种却不行呢?困惑求解!
#include<stdio.h>
int main(){
char a;
int *i;
scanf("%d",i);
printf("%d",*i);
return 0;
} 展开
9个回答
展开全部
#include<stdio.h>
#include<malloc.h>
int main(){
int *i;
i=(int*)malloc(sizeof(int)); //你连内存都没分配不报错才怪,上面的例子也是一样错误
scanf("%d",i);
printf("%d",*i);
return 0;
}
#include<malloc.h>
int main(){
int *i;
i=(int*)malloc(sizeof(int)); //你连内存都没分配不报错才怪,上面的例子也是一样错误
scanf("%d",i);
printf("%d",*i);
return 0;
}
追问
你用c-free看看,行不行?
追答
你第一题是不是,下面这样,你上面写的就是比第二个多了句 char a;
#include
int main(){
int *i;
int a;
i=&a;
scanf("%d",i);
printf("%d",*i);
return 0;
}
展开全部
我个人的理解是这样的:
在MSDN里scanf的定义是这样的:
intscanf(const char*format [,argument]...);
format
Format control string
argument
Optional arguments
他是const char* 型的。传入得参数不是指针,而是格式化的,编译器内部可能是将其的格式化后的内容传个函数。你的两个代码在VC6.0里都不能运行。你是将它的指针传入
在MSDN里scanf的定义是这样的:
intscanf(const char*format [,argument]...);
format
Format control string
argument
Optional arguments
他是const char* 型的。传入得参数不是指针,而是格式化的,编译器内部可能是将其的格式化后的内容传个函数。你的两个代码在VC6.0里都不能运行。你是将它的指针传入
追问
没发现int *i的位置和char a位置定义得有变化吗?我更希望有人你能从栈上去分析,为什么第一个在有些编译环境下就是可以运行的!c-free就可以使得第一程序正确运行出来!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我用GDB跟了一下,两种写法确实有差异:
形式1中: i 被赋初值(int *) 0x7fffffffe7c0
scanf得到的整数输入将写入该地址,程序可以顺利结束。
形式2中: i 被赋初值(int *) 0x00
scanf得到的整数输入尝试写入非法地址,程序崩溃。
编译器可能有某些特殊规则导致了这两种写法的机器码差异。
形式1中: i 被赋初值(int *) 0x7fffffffe7c0
scanf得到的整数输入将写入该地址,程序可以顺利结束。
形式2中: i 被赋初值(int *) 0x00
scanf得到的整数输入尝试写入非法地址,程序崩溃。
编译器可能有某些特殊规则导致了这两种写法的机器码差异。
追问
这么多人,终于有人去真正的去调式过了!不错!哥们,收到我的信件了吗!加一下!交流一下!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不用推敲,这两段代码都不可能为*i赋值,因为i没有指向,是野指针!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不要郁闷了,这2程序是一样的,要么都行,要么都不行。如果一个能编译,一个不能编译,建议你换个编译器。
就语法来说,2个程序都是错误的
就语法来说,2个程序都是错误的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
注意,scanf("%d",i);这句话有问题,在使用scanf函数式注意其函数的参数的使用第一个参数为要输入的类型,后面为要输入数的所在内存单元的地址,应使用&i才可以,上面的两个程序都有问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询