作者wfuny (KuanYu)
看板b96902HW
标题[情报] gets之谜
时间Sat Mar 28 18:01:42 2009
#include<stdlib.h>
#include<stdio.h>
struct MyStruct
{
char str[5];
int i;
};
int main()
{
MyStruct my;
my.i=100;
gets(my.str);
printf("str:%s\n",my.str);
printf("i:%d\n",my.i);
printf("address of i:%p\n",&my.i);
printf("address of str:%p\n",my.str);
int j;
for (j=0;j<10;j++)
printf("j:%d str[j]:%d address of
str[j]:%p\n",j,my.str[j],&my.str[j]);
system("pause");
return 0;
}
为什麽在以上的Code打入1234567890时,i的值是12345呢??
理由如下:
如果我们执行程式,不难发现,i是排在str开头位置後的第8个,记忆体如下:
----
str ->| |
----
| |
----
| |
----
| |
----
| |
----
| |
----
| |
----
| |
----
i --> | |
----
| |
----
如果大家组语还没忘的话,就知道这是为了让读变数更快的排法
因此,若我们打入1234567890,记忆体就会变成,1的ASCII code 为(0x31)
----
str ->|31|
----
|32|
----
|33|
----
|34|
----
|35|
----
|36|
----
|37|
----
|38|
----
i --> |39|
----
|30|
----
又intel为little Indian,因此读i出来值会是(0x3039) = 12345
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.192.28.251
1F:→ ilway25:当时就在想明明是ascii 12345怎麽会印出数字12345... 03/28 19:07
2F:推 jimmycool:所以尽量不要用gets,用fgets吧:p 03/28 19:34
3F:推 electgpro:MyStruct 宣告的时候前面要加 struct 吧?不用吗? 03/28 21:47
4F:推 wolfdigit:int预设是32bits, 所以i应该是0x00003039 03/28 22:12
5F:→ a127a127:C++不用 03/28 23:52
6F:→ electgpro:话说为什麽i会在那里阿? 03/29 00:59
7F:→ wfuny:其实i底下应该还有一个结束字元'\0'值为0,和一个没动过的0 03/29 10:34