#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;
}
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。
*/
【转发】