在我的Tally面试问题中提到了这个问题 请帮帮我,告诉我下面给出的C代码中的错误。 我很感激。
int main()
{
char *p="Tally";
strcpy(p,"piyush");
printf("%s",p);
}
答案 0 :(得分:3)
此代码中存在多个“错误”(无论“错误”应该是什么意思)。
主要问题是代码调用未声明的函数strcpy
和printf
。形式上,这是现代C中的编译错误。在printf
的情况下,这是C前C99版本中的未定义行为。
如果我们解决了这个问题,那么strcpy
调用将尝试修改字符串文字。字符串文字不可修改。这种修改尝试将导致未定义的行为。
由于上面的UB,无法说明传递给printf
的内容,但看起来printf
调用意味着执行输出到文本流而不用换行符完成最后一行字符。它是实现定义的,是否需要这样的换行符。
最后,虽然它不是“错误”,但可以说const char *
指针通常应该用于指向字符串文字。
答案 1 :(得分:1)
p是指向字符串文字"Tally"
的指针。你无法覆盖文字。
答案 2 :(得分:1)
在第3行中,您存储了一个指向字符串文字的指针,然后您尝试用strcpy
覆盖其内容;问题是,字符串文字是只读的(如果你试图在它们上面写它是UB,而在现代平台上它通常会导致崩溃)。
如果你想要一个可写字符串,你必须分配一个本地缓冲区(足够宽以容纳你想要存储在其中的任何数据)。
尽管如此,这些是C语言中字符串处理的基础,我强烈建议您在进一步修改C语言之前修改这些参数。
答案 3 :(得分:1)
p
是指向五个字符串字符的指针。 piyush
长度为六个字符。这将溢出为*p
分配的空间,即使它没有,*p
也因为声明方式而无法修改。
答案 4 :(得分:1)
“Tally”位于可执行文件的只读部分。你正在试图改变它,它很糟糕,因此失败了。有什么问题
答案 5 :(得分:0)
此行错误
char *p="Tally";
指针没有必须写入的地址 你可以这样做
char t;
char *p;
p = &t;
*p='a';
o并且在一个char中你不能放一个字符串
编辑 一个很好看的链接 http://www.physics.drexel.edu/courses/Comp_Phys/General/C_basics/#pointers
答案 6 :(得分:0)
回答您的面试问题 - 以下是此代码的错误:
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.
编辑:
对于那些说不需要返回的人:以下是使用gcc编译-Wall标志时的结果:
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
如果-Wall没有设置,授权编译器会忽略这一点,但包含它仍然是一个好习惯。 @AndreT事实上,gcc发出警告是暗示它应该在那里。肯定的代码仍然可以在没有它的情况下进行编译..但这并不是一个好的做法
编辑2:
当gcc被迫使用C99标准时,它会在没有警告的情况下进行编译。所以请忽略我帖子的第2点。