snprintf在功能内导致中止陷阱6但不在主中

时间:2016-10-30 22:23:34

标签: c arrays printf

我无法理解为什么这段代码会按照它的方式执行。我无法理解为什么当doThings执行时,它会给我一个Abort陷阱:6错误,但是当main中的循环执行时,它不会给我一个错误并打印我的字符数组的有效部分(可以放在里面的值)一个大小为30的数组,字面值为31个字符。)

简而言之,错误发生在doThings中的snprintf语句中。评论它会破坏代码(显然),但不会发生中止陷阱6。但是为什么在main中执行时没有错误会导致错误?

position

1 个答案:

答案 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};