strncpy导致LPC-2378挂起/死亡

Iai*_*inS 1 c embedded strncpy

我正在为Olimex LPC2378-STK做一些工作.

我有以下声明.

unsigned char buffer[256];
Run Code Online (Sandbox Code Playgroud)

然后我尝试做:

strncpy((char *)buffer, "CREATED_BY", 255);
Run Code Online (Sandbox Code Playgroud)

有谁知道这会导致问题的原因.

如果我注释掉它运行的代码行没有问题,但使用它似乎导致程序死亡.

有人有任何想法吗?

Cli*_*ord 5

您发布的代码没有任何内在错误,但它没有上下文.例如,如果buffer[]是局部变量,它将在堆栈上创建,并且您可能溢出堆栈.

您可以将其声明为静态,以查看问题是否消失,这将验证堆栈溢出.如果变量需要是临时的,那么您将需要分配一个适当更大的堆栈.

请注意,堆栈溢出可能不会特别发生在strncpy上.buffer可能包含在堆栈中,但其大小可能已将其他对象推送到堆栈之外,因此写入它们会导致堆栈损坏.故障点通常是函数尝试使用损坏的返回地址返回时.您应该使用调试器来执行代码,以查看调用堆栈,堆栈指针以及函数是否在strncpy上失败,或者在调用函数返回时发生了什么.

有关代码安全性和可维护性的一点,您应该更喜欢:

strncpy((char *)buffer, "CREATED_BY", sizeof(buffer) - 1);
Run Code Online (Sandbox Code Playgroud)

您还可以更方便地使用初始化器:

unsigned char buffer[256] = "CREATED_BY" ;
Run Code Online (Sandbox Code Playgroud)