c - 打印三个内容相同的字符串会得到不同的结果

标签 c arrays gcc

#include "stdio.h"

void main()
{
    char firstName[1] = "1";
    char middleName[1] = "1";
    char lastName[1] = "1";

    printf("%p\t%s\n",firstName,firstName);
    printf("%p\t%s\n",middleName,middleName);
    printf("%p\t%s\n",lastName,lastName);
}

我使用 gcc 4.8.2 编译这段代码,令我困惑的是为什么它打印:

> root@ubuntu:~# ./main

0x7fff7124273d  111
0x7fff7124273e  11
0x7fff7124273f  1

我认为它应该打印:

0x7fff7124273d  1
0x7fff7124273e  1
0x7fff7124273f  1

你能帮帮我吗?

最佳答案

char firstName[1] = "1";

这样初始化 char 数组是合法的,但它不是字符串,因为它不是空终止的。

printf 中的

"%s" 需要一个字符串,因此您正在做的是未定义的行为。


我的猜测是,编译器将变量放在一起,它们后面的字节恰好是0,这可以解释发生了什么。但同样,这是未定义的行为,任何事情都有可能发生。

     '1'      '1'     '1'      0
     ^         ^       ^
 firstName     |       |
         middleName    |
                    lastName

关于c - 打印三个内容相同的字符串会得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26139866/

相关文章:

C - 检查系统是否是虚拟机的便捷方法?

arrays - -join ";"是如何工作的?

c++ - 通过 ctor 右值参数的 Lambda 赋值

C 结构和指针程序在编译时什么都不做。不显示错误或警告

python - 使用 CFFI 的缓冲协议(protocol)

php - 查找元素对

python - 人脸识别-Python

在 C 中正确地将 const void 指针转换为 const char 指针数组

linux - 如何用介子设置调试和优化标志

c - 在 C 中打印一个空的二维数组