【发布时间】:2021-09-14 20:37:31
【问题描述】:
我对 C 很陌生。
能否请您指出我的代码的哪一部分(函数、一些运算符、错误的字符串声明等)在控制台中产生以下输出:
我希望有 OmelianLevkovych。
以下代码sn-p:
#include <stdio.h>
#include <stdlib.h>
const char* GetFullName(char firstName[], char lastName[])
{
return strcat(firstName, lastName);
}
int main()
{
char firstName[] = "Omelian";
char lastName[] = "Levkovych";
char* fullName;
fullName = GetFullName(firstName, lastName);
printf("%s", fullName);
return 0;
}
我正在使用 Code.Block IDE 20.03(默认的 hello-world 模板项目)。
【问题讨论】:
-
char firstName[] = "Omelian";将创建一个完全适合该字符串的数组。尝试向其写入更多内容,就像您对strcat所做的那样,会导致未定义的行为。一种解决方法是声明一个更大的数组:char firstName[128] = "Omelian"; -
@kaylum,对不起,你的意思是我的 GetFullName 函数实际上返回了相同的第一个字符串,对吧?所以
strcat()不会创建另一个字符串文字,而是实际上返回第一个字符串作为结果(显然还添加了另一个字符串)? -
很有趣,我只是把这段代码放在 onlinegdb.com 中,它就可以工作了。虽然它不应该:D
-
@effenok 它有时可以工作。取决于内存中名字字符串后面的内容。
-
“未定义的行为”就是这个意思。有时它“有效”,有时则无效。行为可以从一个运行到下一个运行,从一个系统到另一个系统,使用不同的编译器标志等。一旦你调用 UB(在这种情况下,覆盖数组的边界),所有的赌注都是关于如何从那时起程序将继续执行。
标签: c