Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
strncpy导致LPC-2378挂起/死亡_C_Embedded_Strncpy - Fatal编程技术网

strncpy导致LPC-2378挂起/死亡

strncpy导致LPC-2378挂起/死亡,c,embedded,strncpy,C,Embedded,Strncpy,我正在做一些关于Olimex LPC2378-STK的工作 我有以下声明 unsigned char buffer[256]; 然后我尝试做: strncpy((char *)buffer, "CREATED_BY", 255); 有人知道这会导致问题吗 如果我注释掉它运行时没有问题的代码行,但使用它似乎会导致程序死亡 有人有什么想法吗?您发布的代码没有本质上的错误,但它没有上下文。例如,如果buffer[]是一个局部变量,它将在堆栈上创建,并且可能是堆栈溢出 您可以将其声明为静态,以查看问

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

我有以下声明

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*
    的转换非常可疑)
  • 缓冲区内容未以NUL结尾
  • 您正在溢出缓冲区,覆盖某些内容

  • 使用调试器。

    strncpy会出现很多问题:

  • 您正试图写入尚未分配、地址为空或您无权写入的内存(对
    char*
    的转换非常可疑)
  • 缓冲区内容未以NUL结尾
  • 您正在溢出缓冲区,覆盖某些内容

  • 使用调试器。

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

    发生在我身上的事情是,我没有配置启动代码(如果使用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是最后一个参数。。如果是的话