C 使用snprintf后出现意外输出

C 使用snprintf后出现意外输出,c,printf,overlapping,C,Printf,Overlapping,我得到的是: try to do code try to do code 为什么我得到这个输出?由于sour1,p.sour2位于两个不同的内存位置,我如何在这里应用重叠概念?您的代码调用未定义的行为,strcpy的目标缓冲区太小,无法存储源字符串 从strcpy的列表中: 字符串不能重叠,且目标字符串dest必须为 足够大以接收副本。小心缓冲区溢出!(见 臭虫。) 错误部分: 如果strcpy()的目标字符串不够大,则 任何事情都有可能发生。溢出固定长度字符串缓冲区是一个错误 最受欢迎的饼干

我得到的是:

try to do code
try to do code

为什么我得到这个输出?由于
sour1
p.sour2
位于两个不同的内存位置,我如何在这里应用重叠概念?

您的代码调用未定义的行为,
strcpy
的目标缓冲区太小,无法存储源字符串

从strcpy的
列表中:

字符串不能重叠,且目标字符串
dest
必须为 足够大以接收副本
。小心缓冲区溢出!(见 臭虫。)

错误部分:

如果
strcpy()
的目标字符串不够大,则 任何事情都有可能发生。
溢出固定长度字符串缓冲区是一个错误 最受欢迎的饼干技术,完全控制 机器

C标准确立了未定义行为的概念,如下所示:

C11 N1570第3.4.3条草案
  • 未定义的行为

    使用不可移植或错误的程序结构或错误的数据时的行为,本国际标准对此不作要求

  • 注意

    可能的未定义行为包括:完全忽略情况并产生不可预测的结果,在翻译或程序执行过程中以环境特有的方式(无论是否发出诊断消息)进行行为,以及终止翻译或执行(发出诊断信息)

  • 示例

    未定义行为的一个示例是整数溢出行为

  • 这就是程序中发生的情况,结果完全是任意的,根据未定义行为的定义没有解释,只有对特定构建的生成程序集的分析才能对发生的情况有所了解


    正如您在中所看到的,三种不同的编译器以不同的方式处理此问题,与您的本地编译器也不同,但与我的本地构建不同,后者在崩溃之前生成预期的输出。

    您的代码调用未定义的行为,
    strcpy
    的目标缓冲区太小,无法存储源字符串

    从strcpy的
    列表中:

    字符串不能重叠,且目标字符串
    dest
    必须为 足够大以接收副本
    。小心缓冲区溢出!(请参阅 臭虫。)

    错误部分:

    如果
    strcpy()
    的目标字符串不够大,则 任何事情都有可能发生。
    溢出固定长度字符串缓冲区是一个错误 最受欢迎的饼干技术,完全控制 机器

    C标准确立了未定义行为的概念,如下所示:

    C11 N1570第3.4.3条草案
  • 未定义的行为

    使用不可移植或错误的程序结构或错误的数据时的行为,本国际标准对此不作要求

  • 注意

    可能的未定义行为包括:完全忽略情况并产生不可预测的结果,在翻译或程序执行过程中以环境特有的方式(无论是否发出诊断消息)进行行为,以及终止翻译或执行(发出诊断信息)

  • 示例

    未定义行为的一个示例是整数溢出行为

  • 这就是程序中发生的情况,结果完全是任意的,根据未定义行为的定义没有解释,只有对特定构建的生成程序集的分析才能对发生的情况有所了解


    正如您在中所看到的,三种不同的编译器以不同的方式处理此问题,与您的本地编译器相比也有所不同,但与我的本地构建不同,后者在崩溃之前生成预期的输出。

    strcpy(p.sour2,…
    是缓冲区溢出。这是未定义的行为。任何事情都可能发生。换句话说:不是
    snprintf
    给您带来问题,而是
    strcpy
    strcpy(p.sour2,…
    是缓冲区溢出。这是未定义的行为。任何事情都可能发生。换句话说:不是
    snprintf
    给您带来问题,而是
    strcpy
    try to do code
    try to do code
    
    ake the regular simulation data and add some gaussian noise to it.
    ake the regular simulation data and add some gaussian noise to it. 
    
    char *strcpy(char *dest, const char *src);