这个问题是在我的 Tally 面试问题中提出的,请帮助我并告诉我下面给出的 C 代码中的错误是什么。我将不胜感激。
int main()
{
char *p="Tally";
strcpy(p,"piyush");
printf("%s",p);
}
这段代码中有几个“错误”(“错误”应该是什么意思)。
主要问题是代码调用了未声明的函数strcpy
和printf
. 形式上,这是现代 C 中的编译错误。如果printf
这是 C99 之前的版本中的未定义行为。
如果我们解决了这个问题,那么strcpy
调用将尝试修改字符串文字。字符串文字不可修改。这种修改尝试将导致未定义的行为。
由于上面的 UB,无法说出传递给的内容printf
,但看起来printf
call 是为了执行输出到文本流而没有用换行符完成最后一行。是否需要这种换行符是实现定义的。
最后,虽然它不是一个“错误”,但人们可以争辩说const char *
指针通常应该用于指向字符串文字。
在第 3 行中,您存储了一个指向字符串文字的指针,然后您尝试用 that 覆盖其内容strcpy
;问题是,字符串文字是只读的(如果您尝试在它们上面写,它就是 UB,而在现代平台上它通常会导致崩溃)。
如果你想要一个可写的字符串,你必须分配一个本地缓冲区(足够宽,可以存储你想要存储的任何数据)。
尽管如此,这些是 C 中字符串处理的基础,我强烈建议您在进一步学习之前在您的 C 书上修改这些参数。
p
是一个指向五个字符串文字的指针。piyush
是六个字符长。这将溢出为 分配的空间*p
,即使没有,*p
由于它的声明方式,也无法修改。
“Tally”位于可执行文件的只读部分。你正试图改变它,它犹豫不决,因此失败了。问题是什么
p 是指向字符串字面量的指针"Tally"
。您不能覆盖文字。
Answer to your interview question - Here are the errors with this code :
1. No libraries included, hence printf and strcpy are undeclared functions
2. int main() has no return in the code. return 0; is required // gcc will throw a warning when -Wall flag is set
3. p is a string literal. Which can't be overwritten.
EDIT:
For those of you who say return is not required: Here is the result when compiling with gcc with -Wall flag set:
Notra:Desktop Sukhvir$ gcc -Werror -Wall -g -o try try.c
cc1: warnings being treated as errors
try.c: In function ‘main’:
try.c:19: warning: control reaches end of non-void function
Granted compiler will overlook this if -Wall isn't set, but it is still good practice to include it. @AndreT the very fact that gcc throws up a warning is the hint that it is meant to be there. Sure code can still compile without it .. but that doesn't make it good practice
Edit 2:
when gcc is forced to use C99 standards, it compiles without warnings. So please disregard point 2 of my post.
这条线是错误的
char *p="Tally";
指针没有必须写入的地址,例如可以这样做
char t;
char *p;
p = &t;
*p='a';
o 在一个字符中你不能放一个字符串
编辑一个不错的链接以查看 http://www.physics.drexel.edu/courses/Comp_Phys/General/C_basics/#pointers