列子分析

来源:互联网 发布:阿里云邮箱登录入口 编辑:程序博客网 时间:2024/05/11 19:40

一、数组赋值
对于数组的赋值有多种方式:
int a[] = {1, 2, 3};
int b[3] = {1, 2, 4}; 
int c[4] = {2, 6};// {2, 6, 0, 0}
int d[5] = {[1] = 4, [3] = 9}; // {0, 1, 0, 9, 0}
以上两种情况都会默认把没有赋值的元素赋值为0
而对以下情况就会随机赋值给未赋值的元素
元素个数是常量时:
int e[10];
e[0] = 3;
e[8] = 4;
元素个数是变量时:
int f = 8;
int g[f];
g[2] = 8;
b[6] = 9;
注意:元素个数是变量时不能这么赋值,编译器会报错:
int f = 8;
int g[f] = {0, 0, 8, 0, 0, 0, 9, 0, 0, 0};
总结:
* 数组在定义的同时并初始化的时候,会给未赋值的元素赋默认值
* 数组先定义后初始化时,不会给未赋值的元素赋默认值,而是随机的赋值
二、字符串输出结束问题
[objc] view plaincopy在CODE上查看代码片派生到我的代码片

  1. #include <stdio.h>  
  1.   
  1. int main()  
  1. {  
  1.     char c1[] = {'a''b'};  
  1.     char c2[] = {'c''d'};  
  1.     char c3[] = {'e''f''\0'};  
  1.       
  1.     printf("%s\n", c1);  
  1.     printf("%s\n", c2);  
  1.     printf("%s\n", c3);  
  1.   
  1.     return 0;  
  1. }  
输出:
在内存中得表示如下:

分析:在给变量分配地址时,优先分配高地址给变量,先定义先分配。
输出c1时:会从c1所在的地址ffc8开始依次输出字符a、b,没有遇到\0,但是到了代码块的边界,结果输出:ab
输出c2时:会从c2所在的地址ffc6开始依次输出c、d,但是没有遇到\0,所以继续输出a、b,直到遇到代码块边界,结果输出:cdab
输出c3时:从c3所在地址ffc3开始依次输出e、f,直到遇到\0,输出结束,结果输出:ef
由分析推出:
* 在printf中%s输出字符串时,要么在遇到\0时结束,要么在遇到代码块边界结束。

ab

cdab

fe

0 0