gpt4 book ai didi

c - 如果 strcat 函数中的目标字符串不是空终止的,它是否是未定义的行为?

转载 作者:太空宇宙 更新时间:2023-11-04 00:28:59 25 4
gpt4 key购买 nike

下面的程序

// Code has taken from http://ideone.com/AXClWb
#include <stdio.h>
#include <string.h>

#define SIZE1 5
#define SIZE2 10
#define SIZE3 15

int main(void){
char a[SIZE1] = "Hello";
char b[SIZE2] = " World";
char res[SIZE3] = {0};

for (int i=0 ; i<SIZE1 ; i++){
res[i] = a[i];
}

strcat(res, b);
printf("The new string is: %s\n",res);
return 0;
}

具有明确定义的行为。根据要求,源字符串 b 以 null 结尾。但是如果行

会是什么行为
char res[SIZE3] = {0};  // Destination string

被替换为

char res[SIZE3];  

标准是否明确说明目标字符串也以 null 终止?

最佳答案

TL;DR 是。


由于这是一个语言律师问题,让我加两分钱。

引用 C11,第 §7.24.3.1/2 章(重点是我的)

char *strcat(char * restrict s1,const char * restrict s2);

The strcat function appends a copy of the string pointed to by s2 (including the terminating null character) to the end of the string pointed to by s1. The initial character of s2 overwrites the null character at the end of s1.[...]

并且,根据定义,一个字符串 空终止的,引用§7.1.1/1

A string is a contiguous sequence of characters terminated by and including the first null character.

因此,如果源 char 数组不是以 null 结尾的(即,不是 string),strcat() 可能很好超越边界寻找调用 undefined behavior结束 .

根据您的问题,char res[SIZE3]; 是一个自动局部变量,将包含不确定的值,如果用作 strcat() 的目标,将调用 UB。

关于c - 如果 strcat 函数中的目标字符串不是空终止的,它是否是未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38892901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com