C语言程序输出疑问:为何结果是abcbcc?printf参数为何用&?
问题解答
一、为什么输出是abcbcc而不是abc
首先明确二维数组x[3][4]的内存布局:
因为strcpy(x[i], ch)会把字符串"abc"(包括末尾的'\0')复制到每行,所以每行的4个字符是'a'、'b'、'c'、'\0',内存里连续存储结构如下:
x[0]: a b c \0 x[1]: a b c \0 x[2]: a b c \0
第二个循环中,printf("%s", &x[i][i])是从&x[i][i]指向的地址开始输出字符串,直到遇到'\0',而非输出单个对角线字符:
- 当
i=0时,&x[0][0]指向第一行的'a',输出完整字符串"abc"; - 当
i=1时,&x[1][1]指向第二行的'b',从这里开始输出到末尾的'\0',结果是"bc"; - 当
i=2时,&x[2][2]指向第三行的'c',输出字符串"c";
将三部分输出内容拼接,最终结果就是abcbcc。
二、为什么printf里需要&
printf("%s")要求传入的参数是字符指针(char*),用来指定字符串的起始地址:
x[i][i]是单个char类型的字符,直接传入会把该字符的ASCII值当作内存地址,导致访问非法内存,属于未定义行为;&x[i][i]是取该字符的地址,类型为char*,完全符合%s格式符的参数要求,能正确指向要输出的字符串起始位置。
内容的提问来源于stack exchange,提问作者Levis
相关产品推荐
相关产品推荐

