首页 > 解决方案 > 为什么 '\0' 没有被压入堆栈以指示字符串的结尾?

问题描述

我是 C 的新手,对不起,如果我的问题听起来很愚蠢。我们知道对于下面这样的字符串(来自https://www.tutorialspoint.com/cprogramming/c_strings.htm

char greeting[] = "Hello";

C 将在内存中附加特殊字符\0以指示字符串的结尾,如下图所示: 在此处输入图像描述

所以我只是做了一个实验来证明\0是在内存中,下面是我的代码:

C代码:

int main()
{
   char str[] = "dd";
   printf("%s", str);
   return 0;
}

汇编代码:

//only show relevant code
main:
   subq $24, %rsp
   movw $25700, (%rsp)  //decimal 25700 is 0x6464 where hex 64(decimal 100) is 'd' in ascii
   movb $0, 2(%rsp)
   ...
   call printf
   ...

所以你可以看到汇编代码只将“dd”推送到堆栈,那\0呢?它不会被推入堆栈?那么C如何知道第二个'd'是字符串的结尾?

标签: cgcc

解决方案


推荐阅读