请问我这两个程序有什么问题么?还有什么不同么?
1 #include "stdio.h"
2 #include "stdlib.h"
3 int main()
4 {
5 struct struct_str{
6 char* string;
7 }str;
8 str.string=(char*)malloc(sizeof(str)); //注意是sizeof(str)
9 fgets(str.string,2,stdin);
10 printf("%s",str.string);
11 return 0;
12 }
1 #include "stdio.h"
2 #include "stdlib.h"
3 int main()
4 {
5 struct struct_str{
6 char* string;
7 }str;
8
9 str.string=(char*)malloc(sizeof(char));
10 fgets(str.string,2,stdin);
11 printf("%s",str.string);
12 return 0;
13 }
14
我在gcc -std=c99编译运行都通过
但请问我这两个程序有什么问题么?还有什么不同么?
[解决办法]
开辟缓冲区大小不一样啊
[解决办法]
第二个程序会出现内存覆盖问题。
fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。
由于sizeof(char)等于1,所以第二个程序中开辟的内存空间是1byte而却使用了2byte,导致后面的1byte内存的内容被置0。
[解决办法]
1 #include "stdio.h"
2 #include "stdlib.h"
3 int main()
4 {
5 struct struct_str{
6 char* string;
7 }str;
8
9 str.string=(char*)malloc(sizeof(char)); //得到内存为一字节
10 fgets(str.string,2,stdin); //在这str.string存储了两个字节的内容
11 printf("%s",str.string); //那么可能fgets函数不会考虑越界问题,我认为 ,没找到资料
free(str.string); //还要free();
12 return 0;
13 }
[解决办法]
有问题。
1、你先试试打印sizeof(str)和sizeof(char)的大小,看他们相同么?
2、他们的大小,特别是第二个,足够你放一个字符加一个字符串结束符吗?
3、malloc分配的内存用free释放了吗?