字符数组

#include"stdio.h"
#define M 10
#define N 5
void input(char *s){
    scanf("%s",s);
}
void output(char *s){
    printf("hello %s\n",s);
}

int main(){
    char name[M];
    input(name);
    for(int i=0;i<N;i++){
        output(name);
    }   

    return 0;
}

//字符数组初始化时,数组大小一定要大于字符串长度+1,否则编译错误。
//例如:
//const char ch[6]="Daniel"; 
//error: initializer-string for array of chars is too long. [-fpermissive] 

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[7]="abcdefg";
    printf("%s\n",str);           //方式一:数组分配空间不够,导致没地方存放‘\0’,输出乱码
    int i;
    char str1[100];
    for(i=0;i<7;i++)
    {
        str1[i]=str[i];
    }
    printf("%s\n",str1);          //方式二:数组copy过程中,没有copy到'\0',导致输出乱码

    char str2[]="hjisajnaiji\0huisajhisaji";    //方式三,printf()和puts()的比较
    printf("%s\n",str2);
    puts(str2);

    return 0;
}
/*
printf()和puts()都是遇到结束字符'\0'就停止输入,那么是否只要没有遇到结束字符,不管什么原因、空间不够还好、没有拷贝还好
只要没看到结束字符,就会随机给个乱码输出

1. 都是一直往后遍历,直到遇到内存中第一个 0 为止,在之前输出的就都是乱码。
2. 在数组str[7]后的内存区域中也是有值的,虽然你没有赋值,那些你打印的乱码就是那些区域里的值,直到遇到'\0'3. 不管空间小于字符串长度,还是大于字符串长度,总之只要最后printf()和puts()没有获取到‘\0’这两个函数就会继续读取给定空间之外的变量,因为这个变量是随机的,不可预知的,所以很多时候就会是乱码。
4. 其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

*/

【转发】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值