strncpy导致LPC-2378挂起/死亡
我正在做一些关于Olimex LPC2378-STK的工作 我有以下声明strncpy导致LPC-2378挂起/死亡,c,embedded,strncpy,C,Embedded,Strncpy,我正在做一些关于Olimex LPC2378-STK的工作 我有以下声明 unsigned char buffer[256]; 然后我尝试做: strncpy((char *)buffer, "CREATED_BY", 255); 有人知道这会导致问题吗 如果我注释掉它运行时没有问题的代码行,但使用它似乎会导致程序死亡 有人有什么想法吗?您发布的代码没有本质上的错误,但它没有上下文。例如,如果buffer[]是一个局部变量,它将在堆栈上创建,并且可能是堆栈溢出 您可以将其声明为静态,以查看问
unsigned char buffer[256];
然后我尝试做:
strncpy((char *)buffer, "CREATED_BY", 255);
有人知道这会导致问题吗
如果我注释掉它运行时没有问题的代码行,但使用它似乎会导致程序死亡
有人有什么想法吗?您发布的代码没有本质上的错误,但它没有上下文。例如,如果
buffer[]
是一个局部变量,它将在堆栈上创建,并且可能是堆栈溢出
您可以将其声明为静态,以查看问题是否消失,从而验证堆栈溢出。如果变量需要是临时的,则需要分配一个适当较大的堆栈
请注意,堆栈溢出可能不会特别发生在strncpy<代码>缓冲区可能包含在堆栈中,但其大小可能已将其他对象推到堆栈之外,因此写入这些对象会导致堆栈损坏。失败点通常是当函数试图使用损坏的返回地址返回时。实际上,您应该使用调试器逐步执行代码,以查看调用堆栈、堆栈指针的情况,以及函数在strncpy上是否失败,或者更确切地说,是在调用函数返回时失败
关于代码安全性和可维护性,您应该更喜欢:
strncpy((char *)buffer, "CREATED_BY", sizeof(buffer) - 1);
您还可以更方便地使用初始化器:
unsigned char buffer[256] = "CREATED_BY" ;
您发布的代码本质上没有什么错误,但它没有上下文。例如,如果
buffer[]
是一个局部变量,它将在堆栈上创建,并且可能是堆栈溢出
您可以将其声明为静态,以查看问题是否消失,从而验证堆栈溢出。如果变量需要是临时的,则需要分配一个适当较大的堆栈
请注意,堆栈溢出可能不会特别发生在strncpy<代码>缓冲区可能包含在堆栈中,但其大小可能已将其他对象推到堆栈之外,因此写入这些对象会导致堆栈损坏。失败点通常是当函数试图使用损坏的返回地址返回时。实际上,您应该使用调试器逐步执行代码,以查看调用堆栈、堆栈指针的情况,以及函数在strncpy上是否失败,或者更确切地说,是在调用函数返回时失败
关于代码安全性和可维护性,您应该更喜欢:
strncpy((char *)buffer, "CREATED_BY", sizeof(buffer) - 1);
您还可以更方便地使用初始化器:
unsigned char buffer[256] = "CREATED_BY" ;
strncpy可能会出现很多问题:
char*
的转换非常可疑)使用调试器。strncpy会出现很多问题:
char*
的转换非常可疑)使用调试器。我已经处理了与您报告的问题相同的问题 发生在我身上的事情是,我没有配置启动代码(如果使用keil)来为堆内存保留空间。printf家族函数使用malloc和free,因此堆空间是必需的
如果您使用的是GCC,问题是您没有正确设置newlib。检查堆。我处理了与您报告的问题相同的问题 发生在我身上的事情是,我没有配置启动代码(如果使用keil)来为堆内存保留空间。printf家族函数使用malloc和free,因此堆空间是必需的
如果您使用的是GCC,问题是您没有正确设置newlib。检查堆。在这里使用
strncpy
没有意义。您可能会避免潜在的缓冲区溢出,但如果缓冲区不够大,则最终会出现不同的问题。但这看起来并不是问题的原因,我不认为这有什么问题,除了它毫无意义。如果要使用strncpy()
您需要记住,它总是写入N个字符,其中N是最后一个参数。。如果源字符串长度(包括null终止符)小于N,则它将用0将剩余空间回填到N。如果更长,它将最多复制N个字符,而不会将最后一个字符设置为0。但它总是以这样或那样的方式写N个字符。我想你可能在某个地方遇到了另一个问题,这个问题正在溢出到这个缓冲区中,并且可能是0-clear暴露了这个问题。谢谢各位,我一直在想。关于其他方面的观点是好的。考虑到电路板和堆栈空间的限制,这可能就是问题所在。调试即将开始。请尽量将缓冲区大小减小到最小enough@Clifford真正地因为根据标准C9899§7.23.2.4,p3“如果s2指向的数组是短于n个字符的字符串,则会将空字符附加到s1指向的数组中的副本,直到总共写入n个字符。”。我使用过的每一个声称符合标准的库都会这样做,所以我不确定您使用的是哪一个库。在这里使用strncpy
是没有意义的。您可能会避免潜在的缓冲区溢出,但如果缓冲区不够大,则最终会出现不同的问题。但这看起来并不是问题的原因,我不认为这有什么问题,除了它毫无意义。如果要使用strncpy()
您需要记住,它总是写入N个字符,其中N是最后一个参数。。如果是的话