我无法理解为什么这段代码会按照它的方式执行。我无法理解为什么当doThings执行时,它会给我一个Abort陷阱:6错误,但是当main中的循环执行时,它不会给我一个错误并打印我的字符数组的有效部分(可以放在里面的值)一个大小为30的数组,字面值为31个字符。)
简而言之,错误发生在doThings中的snprintf语句中。评论它会破坏代码(显然),但不会发生中止陷阱6。但是为什么在main中执行时没有错误会导致错误?
position
答案 0 :(得分:2)
首先,通过说
char aString[BUF_LEN] = "1234567890123456789012345678901";
您正在为30-char数组提供31 char
s初始化程序列表。这并没有错,但尝试将char
数组用作字符串会导致UB,因为没有空终止符。
将BUF_LEN
定义为32,或让编译器决定大小,使用类似
char aString[ ] = "1234567890123456789012345678901";
其中编译器根据提供的初始化程序的长度选择正确的数组大小,包括终止空值。
然后,我相信,它也与你的循环条件有关。而不是
for (i = 0; i <= BUF_LEN; i++)
你应该做
for (i = 0; i < BUF_LEN; i++)
否则,您将成为off-by-one,因为C数组使用基于0的索引。这样,您将访问调用undefined behavior的绑定内存。
另外,正如Chux in the comments正确提到的那样,您正在使用
strcat(anotherBuffer, temp);
而anotherBuffer
未初始化。根据定义,strcat()
的第一个参数应该是指向字符串的指针,即指向以null结尾的char
数组的指针。在一开始,anotherBuffer
的内容是不确定的,更不用说具有空终止符。你应该总是初始化自动局部变量,就像在这种情况下,
char anotherBuffer[BUF_LEN] = {0};