有关字符串常量作函数参数的问题

时间:2022-07-30 22:45:00
我实在不知道这个程序为什么会是这样的,今天在写uart的裸板程序如下:
char test[] = "abc";
init_uart();
putc('0');
putc('1');
puts("abc");
putc('o');
puts(test);
...
...

void puts(char *s)
{
int i = 0;
while (s[i])
{
putc(s[i]);
i++;
}
}
程序结果,测试putc正常,第一个puts("abc")输出乱码,并在puts中测试s指针为NULL;第二个puts(test),正常打印abc;我实在是想不出这个地方有什么问题,发帖请教个为大神些。

5 个解决方案

#1


第一,库里面已经有个puts了,小心冲突。
第二,两个"abc"存的地方不尽相同,嵌入式可能更明显。

#2


可能缓存溢出?

#3


引用 1 楼 ForestDB 的回复:
第一,库里面已经有个puts了,小心冲突。
第二,两个"abc"存的地方不尽相同,嵌入式可能更明显。


这个问题你仔细看看

#4


引用 1 楼 ForestDB 的回复:
第一,库里面已经有个puts了,小心冲突。
第二,两个"abc"存的地方不尽相同,嵌入式可能更明显。

关于第一条在编译的时候加上
CFLAGS := -Wall -O2
CPPFLAGS := -nostdinc -nostdlib -fno-builtin 不使用编译器的库函数
第二:puts("abc")的参数存在rodata区,以下是反汇编代码
51000530: e59f0044  ldr r0, [pc, #68] ; 5100057c <main+0x74>
51000534: ebffff92  bl 51000384 <puts>
....
5100057c: 51000a58  tstpl r0, r8, asr sl
....
51000a58 <.rodata.str1.4>:
51000a58: 00636261  rsbeq r6, r3, r1, ror #4

传入puts的参数5100057c地址的内容51000a58 ,这个51000a58 上存的就是00636261(abc)

puts(test)的反汇编代码:
5100050c: e59f3064  ldr r3, [pc, #100] ; 51000578 <main+0x70>
51000510: e24dd008  sub sp, sp, #8
51000514: e28d4008  add r4, sp, #8
51000518: e5243004  str r3, [r4, #-4]!
....
51000540: e1a00004  mov r0, r4
51000544: ebffff8e  bl 51000384 <puts>
....
51000578: 00636261  rsbeq r6, r3, r1, ror #4

查看地址也没有问题。

#5


仿真啊,光看是不行的,一步一步调

#1


第一,库里面已经有个puts了,小心冲突。
第二,两个"abc"存的地方不尽相同,嵌入式可能更明显。

#2


可能缓存溢出?

#3


引用 1 楼 ForestDB 的回复:
第一,库里面已经有个puts了,小心冲突。
第二,两个"abc"存的地方不尽相同,嵌入式可能更明显。


这个问题你仔细看看

#4


引用 1 楼 ForestDB 的回复:
第一,库里面已经有个puts了,小心冲突。
第二,两个"abc"存的地方不尽相同,嵌入式可能更明显。

关于第一条在编译的时候加上
CFLAGS := -Wall -O2
CPPFLAGS := -nostdinc -nostdlib -fno-builtin 不使用编译器的库函数
第二:puts("abc")的参数存在rodata区,以下是反汇编代码
51000530: e59f0044  ldr r0, [pc, #68] ; 5100057c <main+0x74>
51000534: ebffff92  bl 51000384 <puts>
....
5100057c: 51000a58  tstpl r0, r8, asr sl
....
51000a58 <.rodata.str1.4>:
51000a58: 00636261  rsbeq r6, r3, r1, ror #4

传入puts的参数5100057c地址的内容51000a58 ,这个51000a58 上存的就是00636261(abc)

puts(test)的反汇编代码:
5100050c: e59f3064  ldr r3, [pc, #100] ; 51000578 <main+0x70>
51000510: e24dd008  sub sp, sp, #8
51000514: e28d4008  add r4, sp, #8
51000518: e5243004  str r3, [r4, #-4]!
....
51000540: e1a00004  mov r0, r4
51000544: ebffff8e  bl 51000384 <puts>
....
51000578: 00636261  rsbeq r6, r3, r1, ror #4

查看地址也没有问题。

#5


仿真啊,光看是不行的,一步一步调