strlen(p+10) 计算字符串 "Three" 的长度 "Three" 有5个字符 输出:5

C语言程序执行分析

程序代码

#include <stdio.h>
#include <string.h>
void main()
{
    char str[][10] = {"One", "Three", "Five"};
    *p = str[0];
    printf("%s,", p+10);
    printf("%d\n", strlen(p+10));
}

逐步分析

1. 变量声明和初始化

char str[][10] = {"One", "Three", "Five"};
  • 这声明了一个二维字符数组
  • 数组有3行,每行10个字符
  • 内存布局如下:
    str[0]: "One\0"      (地址假设为1000)str[1]: "Three\0"    (地址假设为1010)  str[2]: "Five\0"     (地址假设为1020)
    

2. 指针赋值

*p = str[0];

注意:这里代码有语法错误!

  • 应该是 char *p = str[0]; 或者先声明 char *p; 再赋值
  • 假设代码意图是 char *p = str[0];
  • 这样 p 指向 str[0] 的首地址(即字符串"One"的开始位置)

3. 第一个printf语句

printf("%s,", p+10);
  • p 指向 str[0] 的开始位置
  • p+10 指向 p 位置向后偏移10个字节的位置
  • 由于每行正好是10个字节,p+10 指向 str[1] 的开始位置
  • 所以 p+10 指向字符串 "Three"
  • 输出:Three,

4. 第二个printf语句

printf("%d\n", strlen(p+10));
  • strlen(p+10) 计算字符串 "Three" 的长度
  • "Three" 有5个字符
  • 输出:5

最终输出结果

Three,5

内存布局图示

地址:    1000  1001  1002  1003  1004  1005  1006  1007  1008  1009
str[0]:   O     n     e    \0     ?     ?     ?     ?     ?     ?
         ↑
         p指向这里

地址:    1010  1011  1012  1013  1014  1015  1016  1017  1018  1019  
str[1]:   T     h     r     e     e    \0     ?     ?     ?     ?
         ↑
         p+10指向这里

地址:    1020  1021  1022  1023  1024  1025  1026  1027  1028  1029
str[2]:   F     i     v     e    \0     ?     ?     ?     ?     ?

答案

正确答案是 C. Three,5

注意事项

  1. 原代码中的 *p = str[0]; 是语法错误,应该是指针声明和赋值
  2. 这种指针算术运算依赖于数组在内存中的连续存储
  3. 每个字符串占用固定的10字节空间,所以 p+10 正好指向下一个字符串
posted @ 2025-08-31 17:34  量子我梦  阅读(3)  评论(0)    收藏  举报