-8

这个问题是在我的 Tally 面试问题中提出的,请帮助我并告诉我下面给出的 C 代码中的错误是什么。我将不胜感激。

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

7 回答 7

3

这段代码中有几个“错误”(“错误”应该是什么意思)。

主要问题是代码调用了未声明的函数strcpyprintf. 形式上,这是现代 C 中的编译错误。如果printf这是 C99 之前的版本中的未定义行为。

如果我们解决了这个问题,那么strcpy调用将尝试修改字符串文字。字符串文字不可修改。这种修改尝试将导致未定义的行为。

由于上面的 UB,无法说出传递给的内容printf,但看起来printfcall 是为了执行输出到文本流而没有用换行符完成最后一行。是否需要这种换行符是实现定义的。

最后,虽然它不是一个“错误”,但人们可以争辩说const char *指针通常应该用于指向字符串文字。

于 2013-10-18T14:26:17.577 回答
1

在第 3 行中,您存储了一个指向字符串文字的指针,然后您尝试用 that 覆盖其内容strcpy;问题是,字符串文字是只读的(如果您尝试在它们上面写,它就是 UB,而在现代平台上它通常会导致崩溃)。

如果你想要一个可写的字符串,你必须分配一个本地缓冲区(足够宽,可以存储你想要存储的任何数据)。

尽管如此,这些是 C 中字符串处理的基础,我强烈建议您在进一步学习之前在您的 C 书上修改这些参数。

于 2013-10-18T14:25:55.327 回答
1

p是一个指向五个字符串文字的指针。piyush是六个字符长。这将溢出为 分配的空间*p,即使没有,*p由于它的声明方式,也无法修改。

于 2013-10-18T14:26:01.167 回答
1

“Tally”位于可执行文件的只读部分。你正试图改变它,它犹豫不决,因此失败了。问题是什么

于 2013-10-18T14:26:21.650 回答
1

p 是指向字符串字面量的指针"Tally"。您不能覆盖文字。

于 2013-10-18T14:25:17.850 回答
0

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.

于 2013-10-18T14:33:16.570 回答
0

这条线是错误的

char *p="Tally";

指针没有必须写入的地址,例如可以这样做

char t;
char *p;
p = &t;
*p='a';

o 在一个字符中你不能放一个字符串

编辑一个不错的链接以查看 http://www.physics.drexel.edu/courses/Comp_Phys/General/C_basics/#pointers

于 2013-10-18T14:28:33.557 回答