C交叉编译:sprintf只写\0“;大小为[512][4]的数字[111][1]的数组后面的字符初始化为0

C交叉编译:sprintf只写\0“;大小为[512][4]的数字[111][1]的数组后面的字符初始化为0,c,printf,uart,nxp-microcontroller,C,Printf,Uart,Nxp Microcontroller,这是胡桃夹子。 ubuntu 16.04上NXP imx.6的交叉编译 使用gcc-arm-none-eabi-5_2-2015q4进行编译。 使用jlinkbase进行调试。代码编译和运行时没有错误,但输出错误 守则: 文件:uart_print.c #include "imx_uart.h" uart_instance = HW_UART4; # defined in another file void uartWriteString(void *str) { uint8_t

这是胡桃夹子。 ubuntu 16.04上NXP imx.6的交叉编译 使用gcc-arm-none-eabi-5_2-2015q4进行编译。 使用jlinkbase进行调试。代码编译和运行时没有错误,但输出错误

守则: 文件:uart_print.c

#include "imx_uart.h"
uart_instance = HW_UART4; # defined in another file

void uartWriteString(void *str) {

     uint8_t mystr;                                                                                                                                                                                                                 
     while (*(uint8_t *)(str) != '\0')     {                                                                                    
        mystr = *(uint8_t *)str++;                                                                                             
        uart_putchar(uart_instance, &mystr);   //Write data                                                                    
     }                                                                                                                          
}
文件:myfile.c

#include "uart_print.h"
#include "sdk.h"
void myfunc() {
    char str[40];
    int i, char_written;
    int myarray[512][4];
    char_written = sprintf(str, "123456789"); //This works str="123456789\0"
    //DEBUGGER output here: char_written = 9
    for (i = 0; i < 512; i++){
        myarray[i][0] = 0;
        myarray[i][1] = 0;  // <-- Problem starts here
        myarray[i][2] = 0;
        myarray[i][3] = 0;
    }
    char_written = sprintf(str, "0123456789"); 
    uartWriteString(str); //uart: str=\023456789\0
    //DEBUGGER output here: char_written = 0
调试器输出: 如果myarray[0-110][0-3]=0和myarray[111][0]=0,则str=123456789

str=\023456789如果myarray[111][1]=0
且始终在此之后;
sprintf
在设置
myarray[111][1]=0
后将永远无法正常工作

如果我删除myarray[111][1]=0
myarray[111][2]=0
将使
sprintf write str=1234\06789
,此处仅写入前4个符号


我想不出连接,内存有问题吗?他们正在覆盖一些重要的寄存器。考虑到我已经花了两天的时间,现在有什么输入是很受欢迎的吗?

< P> >这里要考虑的几个事情:

1) 使用memset,您可以更轻松/更快地初始化矩阵:

memset(myarray, 0, sizeof(myarray[0][0]) * m * n);
2) 使用snprintf而不是sprintf可以更好地控制指定字符串的最大长度

3) “charwrt”的定义在哪里

4) 在for循环之后,你想做什么?您正在一次又一次地覆盖“str”:

char_written= sprintf(str, "0123456789"); //str=\023456789\0
...
myarray[i][0] = 0;
char_written= sprintf(str, "0123456789");
myarray[i][1] = 0;
char_written= sprintf(str, "0123456789");
5) 在对循环进行迭代之后,“i”值始终为512


6) 如果您发布一个更简单但可以工作/编译的代码来重现您的问题,我们可能会提供更多帮助。

局部变量通常放在堆栈上。为您的程序分配了多少堆栈?当您不在任何地方调用它时,为什么要向我们显示
uartWriteString
?这是问题的一部分吗?
uart\u putchar(uart\u实例,&mystr)
是否确定,函数需要指针而不是单个字符?
mystr=*(uint8_t*)str++是一个错误。不能增加一个
void*
。如果没有看到错误消息,则考虑更改编译器标志以获得一致性模式。您可能有堆栈溢出。查看平台文档、链接器脚本等,找出堆栈大小及其所在位置。这如何回答问题?1)memset无法解决此问题。同样的问题仍然存在。这个问题也存在于不同的文件类型中,比如float。我无法在float上可靠地使用memset。2) 好的,我可以试试看,chrwrt现在改成char_-write了,对不起,这个细节。4) 在for循环中:我正在调试每个步骤,以查看sprintf失败的循环迭代。我正在覆盖,因为在I达到111之后它失败,我们将写入myarray[111][1]。可能出于某种原因,您提供了uartWriteString,但该函数未在代码段中调用。函数“myfunc”在x86_64和gcc下编译良好。Valgrind说一切都好。提供失败函数(myfunc)的确切源代码(而不仅仅是代码片段)会很有帮助。我不是舒尔。如何向您提供所有这些,您希望从我的源代码中获得什么?考虑到它是基于imx sdk的,所以它相当大。
char_written= sprintf(str, "0123456789"); //str=\023456789\0
...
myarray[i][0] = 0;
char_written= sprintf(str, "0123456789");
myarray[i][1] = 0;
char_written= sprintf(str, "0123456789");