2012-07-08 53 views
0
void main() 
{ 
char c; 
clrscr(); 
printf("Enter your name:\n"); 
scanf("%s", c); 
printf("You entered your name as : \n") 
printf("%s",c); 
getch(); 
} 

output// 
Enter Your name: 
sandeep 
You entered your name as : 
sandeep 

我不明白这个单个字符变量'c'如何存储字符串,当它不是一个字符数组?这个代码是如何工作的C

+2

它只是在意外工作*。你正在写入你不属于自己的记忆。更不用说你通过不匹配格式说明符和实际传递的数据来调用未定义的行为。 – DCoder 2012-07-08 05:40:29

+0

如果你的名字足够长,你会达到一个段违规错误 – 2012-07-08 05:52:00

+0

@DCoder:亲爱的朋友,我也是一个程序员,我也知道这是一个错误的程序,&outcum shud不像我展示的方式。但是我想知道为什么这个代码每次都给n以上的输出。我也在不同的系统上试过这个代码。 – 2012-07-09 13:21:04

回答

0

即使它看起来工作,scanf会将字符串写入未分配的内存位置。你可以使用一个数组,否则你的程序可能会在某一天崩溃。

4

它不,真的。

你传递c(不是的c地址)scanf,所以它被晋升为int,然后作为一个指针的值(因为“%S”希望通过一个指向一些内存写入)。这给未定义的行为。很明显,您碰巧在c的价值,当提升到int恰好出现在您可以写入的地址,而不会立即导致明显的问题。

当你将它传递给printf时,也发生了几乎相同的事情,并且由于地址匹配,输出与输入匹配 - 但不能保证如果再次运行相同的可执行文件,它将继续执行,或者如果使用不同的编译器编译,在不同的系统上运行等。

+0

我相信只有错别字。如果你更正了代码并使用&c而不是c,它就像他所说的那样工作,但是如果名称太长,会产生段违例(在ubuntu 10.04中使用gcc进行测试) – 2012-07-08 05:57:54

+0

Downvoter care to comment?如果是你@Pablo,你是否诚实地认为答案有资格成为“没有帮助”,因为它讨论了问题中的含义,而不是你认为可能存在的内容?在答案被认为是有用的之前,是否需要思维? – 2012-07-08 06:18:58

+0

我认为你的答案是有用的,但是我努力尝试这段代码,并找到一种方法让它像提问者说的那样工作。我低估了,因为我认为最受投票的答案应该是那个我认为不是他想要的真正问题的答案。这是我用stackoverflow看到的一个问题;一旦某人回答某个问题并得到几张选票,问题就会停止引起任何关注,而真正的问题从未得到满足。 – 2012-07-08 15:36:06

1

这是错误的。如果它起作用,它会偶然发生,随机值恰好在'c'和接下来的4或7个字节(取决于您的地址大小),指向相对无害的内存区域。也许如果你足够的运行,当c和c周围的垃圾指向不太良性的内存区域时,会产生内存错误。

它应该是char * c,用缓冲区或字符数组初始化。 C是一种非常非常简单的语言。它应该在编译期间发出警告。

0

您没有编译时错误,因为scanf的原型具有“...”作为第二个参数。这意味着没有类型检查。无论您是否遇到运行时错误,都取决于您的运气。