首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C交叉编译:在[512][4] number [111][1]大小的数组初始化为0后,sprintf仅写入"\0“字符

C交叉编译:在[512][4] number [111][1]大小的数组初始化为0后,sprintf仅写入"\0“字符
EN

Stack Overflow用户
提问于 2018-06-19 18:03:02
回答 1查看 84关注 0票数 0

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

代码:

file:uart_print.c

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

for循环中发生了一些事情,扰乱了sprintf函数。因此,我尝试在for循环中使用sprintf:

代码语言:javascript
复制
    ...
    myarray[i][0] = 0;
    char_written = sprintf(str, "0123456789");
    myarray[i][1] = 0;
    char_written = sprintf(str, "0123456789");
    myarray[i][2] = 0;
    myarray[i][3] = 0;
}

调试器输出:

str = 123456789 if myarray[0 - 110][0-3] = 0 and myarray[111][0] = 0

str = \023456789 if myarray[111][1] = 0并始终在此之后;设置myarray[111][1] = 0后,sprintf永远不会正常工作

如果我删除myarray[111][1] = 0myarray[111][2] = 0会生成sprintf write str=1234\06789,这里只写了前4个符号。

我找不到连接,是不是内存有问题?它们是否覆盖了一些重要的寄存器。鉴于我已经在这上面花了两天时间,现在有什么建议是非常受欢迎的吗?

EN

回答 1

Stack Overflow用户

发布于 2018-06-19 18:21:53

这里需要考虑的几件事:

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

代码语言:javascript
复制
memset(myarray, 0, sizeof(myarray[0][0]) * m * n);

2)使用snprintf而不是sprintf可以更好地控制指定字符串的最大长度。

3) charwrt的定义在哪里?

4)在for循环之后,您想要做什么?您一次又一次地重写"str“:

代码语言:javascript
复制
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)也许如果你发布一个更简单但可以工作/编译的代码来重现你的问题,我们可以提供更多帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50925655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档