1

我正在做一些关于 Olimex LPC2378-STK 的工作。

我有以下声明。

unsigned char buffer[256];

然后我尝试做:

strncpy((char *)buffer, "CREATED_BY", 255);

有谁知道为什么这会导致问题。

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

有人有什么想法吗?

4

3 回答 3

5

您发布的代码本质上没有任何问题,但它没有上下文。例如,如果buffer[]是一个局部变量,它将在堆栈上创建,并且您可能会溢出堆栈。

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

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

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

strncpy((char *)buffer, "CREATED_BY", sizeof(buffer) - 1);

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

unsigned char buffer[256] = "CREATED_BY" ;
于 2013-02-24T08:50:51.323 回答
1

strncpy 可能会出现很多问题:

  1. 您正在尝试写入尚未分配的内存,具有 NULL 地址,或者您没有权限(强制转换char *为高度可疑),
  2. 您的缓冲区内容不是 NUL 终止的
  3. 您正在溢出缓冲区,覆盖某些内容。

使用调试器。

于 2013-02-24T09:25:09.620 回答
0

我已经处理了您报告的相同问题。

发生在我身上的是我没有配置启动代码(如果使用 keil)来为 HEAP 内存保留空间。printf 系列函数使用 malloc 和 free,因此,HEAP 空间是强制性的。

如果您使用的是 GCC,问题是您没有正确设置 newlib。检查堆。

于 2013-03-11T20:48:31.100 回答