我正在Olimex LPC2378-STK上做一些工作。
我有以下声明。
unsigned char buffer[256];
然后我尝试做:
strncpy((char *)buffer, "CREATED_BY", 255);
有人知道为什么这会引起问题吗。
如果我注释掉代码行,它运行时没有问题,但使用它似乎会导致程序死亡。
有人有什么想法吗?
您发布的代码本质上没有什么问题,但它没有上下文。例如,如果buffer[]
是一个局部变量,它将在堆栈上创建,并且可能会溢出堆栈。
您可以将其声明为静态,以查看问题是否消失,从而验证堆栈溢出。如果变量需要是临时的,那么您将需要分配一个合适的更大的堆栈。
请注意,堆栈溢出可能不会特别发生在strncpy上。buffer
可能包含在堆栈中,但其大小可能已将其他对象推到堆栈之外,因此写入对象会导致堆栈损坏。失败点通常是当函数试图使用损坏的返回地址返回时。实际上,您应该使用调试器来逐步执行代码,以查看调用堆栈、堆栈指针发生了什么,以及函数是否在strncpy上失败,或者更确切地说,当调用函数返回时失败。
关于代码的安全性和可维护性,您应该更喜欢:
strncpy((char *)buffer, "CREATED_BY", sizeof(buffer) - 1);
您还可以更方便地使用初始化程序:
unsigned char buffer[256] = "CREATED_BY" ;
strncpy:可能会出现很多问题
- 您正试图写入尚未分配的内存、具有NULL地址或没有权限写入(转换为
char *
非常可疑( - 您的缓冲区内容未被NUL终止
- 您的缓冲区溢出,覆盖了某些内容
使用调试器。
我已经处理了您报告的相同问题。
发生在我身上的是,我没有配置启动代码(如果使用keil(来为HEAP内存保留空间。printf家族函数使用malloc和free,因此HEAP空间是必需的。
如果您使用GCC,问题是您没有正确设置newlib。检查堆。