C 在没有任何警告的情况下,设置的字符数超过声明的字符数

C 在没有任何警告的情况下,设置的字符数超过声明的字符数,c,gcc,C,Gcc,我用一个简单的例子复制了它: #include <stdio.h> int main(int argc, char **argv) { char l1[16]; sprintf(&l1, "%s", "Hello AKIT!!!!!!!!!!!!!!!!"); printf(l1); printf("\n"); return 0; } #包括 int main(int argc,字符**argv) { charl1[16]; sp

我用一个简单的例子复制了它:

#include <stdio.h>

int main(int argc, char **argv)
{
    char l1[16];

    sprintf(&l1, "%s", "Hello AKIT!!!!!!!!!!!!!!!!");
    printf(l1);
    printf("\n");
    return 0;
}
#包括
int main(int argc,字符**argv)
{
charl1[16];
sprintf(&l1,“%s”,“你好,AKIT!!!!!!!!!!!!!!!”;
printf(l1);
printf(“\n”);
返回0;
}
即使我的var被声明为16个字符的长度,我也可以在编译器没有任何错误的情况下输入更多的字符,甚至可以正常工作。 我预计字符串将被剪切到16个字符,但不会。为什么?以及如何获得剪切字符串?

我可以在编译器中输入更多字符而不会出现任何错误

您的代码没有违反任何语法规则(下面的示例中指出的除外),因此编译器没有理由抱怨。然而,这:

char l1[16];

    //sprintf(&l1, "%s", "Hello AKIT!!!!!!!!!!!!!!!!");  // & is wrong  l1 is already a pointer
                                                         // and should have resulted in 
                                                         // incompatible pointer type warning.

    sprintf(l1, "%s", "Hello AKIT!!!!!!!!!!!!!!!!");  
…是的。这意味着有时您的程序看起来会工作,但在任何时候,它都可能停止工作。写入时,您正在覆盖缓冲区。但是C程序只会在运行时发出抱怨,并且只有当您正在写入的内存(不属于您)属于另一个进程时才会发出抱怨。然后将发生运行时故障


防止缓冲区溢出问题的方法(仔细编程除外)包括学习和使用。还有一个可以与
sprintf()

一起使用的未定义行为意味着任何事情都可能发生。这是未定义的行为(不同平台上的不同结果,甚至在同一平台上的不同执行期间)。事实上,在这种情况下,一种定义非常明确的行为(并非出于正当理由)是,人们将在几秒钟内开始否决你的问题,因为你违反了神圣的规则“不应做、说或暗示任何可能导致未定义行为的事”。这称为缓冲区溢出:)欢迎使用C编程“编译器没有任何错误”-这是因为编译器不关心编译后的代码是否调用未定义的行为:你不关心,它也不会..Serhii,你能用“字符”替换“章节”吗?章节是书中的一部分。@Ryker你可以回答“我如何才能剪断字符串?”:
snprintf
%15s
@LegendofPedro-谢谢。我确实采纳了你的建议<代码>您的代码没有违反任何语法规则——但很容易检查,为什么gcc不这么做?可能编译器有一些特殊的标志来检查此问题?请尝试在中设置include
-Wall
,以包括所有错误和警告。
gcc-Wall-o main.c
不会显示任何其他警告