以下C代码有什么错误?

时间:2013-10-18 14:22:28

标签: c string

在我的Tally面试问题中提到了这个问题 请帮帮我,告诉我下面给出的C代码中的错误。 我很感激。

int main()
{
    char *p="Tally";
    strcpy(p,"piyush");
    printf("%s",p);
}

7 个答案:

答案 0 :(得分:3)

此代码中存在多个“错误”(无论“错误”应该是什么意思)。

主要问题是代码调用未声明的函数strcpyprintf。形式上,这是现代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点。