【发布时间】:2013-06-23 02:09:06
【问题描述】:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
char str[5]={'\0'};
printf("Initial length before passing = %ld\n",strlen(str));
input(str);
printf("Received string = %s\n",str);
printf("Length after getting input(calling function) = %ld\n",sizeof(str));
}
input(char * buffer)
{
puts("Enter something: ");
printf("Initial length after passing = %ld\n",strlen(buffer));
if ( fgets(buffer, sizeof(buffer), stdin) == NULL )
return -1;
else
{
printf("Length after getting input(called function)= %ld\n",strlen(buffer));
return 0;
}
}
输出 1
Initial length before passing = 0
Enter something:
Initial length after passing = 0
hello
Length after getting input(called function)= 6
Received string = hello
Length after getting input(calling function) = 5
输出 2
Initial length before passing = 0
Enter something:
Initial length after passing = 0
helloooooo
Length after getting input(called function)= 7
Received string = hellooo
Length after getting input(calling function) = 5
为什么当我输入不同的输入时它会打印不同的长度?
- 在输出 1 和 2 中,为什么我只为 5 个字符分配空间时初始长度为 6?
- 为什么输出1和输出2传入前后字符串长度不同?
- 在输出 2 中,当我只分配较少空间时,为什么“获取输入后的长度(调用函数)= 7”?
【问题讨论】:
-
您必须运行 64 位编译。如果不是,
input()中的sizeof(buffer)将是 4,并且您会看到两个输入序列的字符串hel。您必须将数组的大小显式传递给函数:extern int input(char *buffer, size_t buflen);,然后在函数内部引用buflen而不是sizeof(buffer)。其余的基本上是调用未定义的行为;你得到你所得到的,没有理由抱怨,因为你溢出了你的数组。 C 不能保护你免受你自己或你的无知;这是一种苛刻的语言(但也很强大和有趣)。