C语言2个问题

[复制链接]
查看11 | 回复8 | 2021-1-27 06:18:50 | 显示全部楼层 |阅读模式
第一个问题:为什么第一张图片有奇怪的符号,而第二张没有



第二个问题:

书上写如果一个字符数组中先后存放多个不同长度的字符串,则应使数组长度大于最长的字符串的长度,那为什么char[0]也可以


#include
#include
intmain()
{
charc[]={"Cprogram"};
chard[]={"Hello"};
chare[]={'C','','p','r','o','g','r','a','m'};
inti;
for(i=0;i

#include
intmain()
{
chare[]={'C','','p','r','o','g','r','a','m'};
//for(i=0;i

#include
intmain()
{
chara[0];
//将"abcd"保存到a中
strcpy(a,"abcde");
//输出a中的字符串
puts(a);
//将"1234"保存到a中
strcpy(a,"1234");
//输出a中的字符串
puts(a);
}

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:18:50 | 显示全部楼层

#include
#include
intmain()
{
charc[]={"Cprogram"};
chard[]={"Hello"};
chare[]={'C','','p','r','o','g','r','a','m'};
inti;
for(i=0;i


#include
intmain()
{
chare[]={'C','','p','r','o','g','r','a','m'};
//for(i=0;i


#include
intmain()
{
chara[0];
//将"abcd"保存到a中
strcpy(a,"abcde");
//输出a中的字符串
puts(a);
//将"1234"保存到a中
strcpy(a,"1234");
//输出a中的字符串
puts(a);
}


回复

使用道具 举报

千问 | 2021-1-27 06:18:50 | 显示全部楼层


为什么超出了5个字节还是不会发出警告?

#include
intmain()
{
charstr[5];
gets(str);
puts(str);
return0;
}

回复

使用道具 举报

千问 | 2021-1-27 06:18:50 | 显示全部楼层
占用的静态数据分区,由于没有定义结束符,puts实际可能会发生越界访问,这个显示时随机的
回复

使用道具 举报

千问 | 2021-1-27 06:18:50 | 显示全部楼层
另外,这里面的用法gets是不可信的,可以注入非法字符串,产生内存coredump
回复

使用道具 举报

千问 | 2021-1-27 06:18:50 | 显示全部楼层


改成了printf还存在乱码

#include
#include
intmain()
{
charc[]={"Cprogram"};
chard[]={"Hello"};
chare[]={'C','','p','r','o','g','r','a','m'};
inti;
for(i=0;i
回复

使用道具 举报

千问 | 2021-1-27 06:18:50 | 显示全部楼层




为什么?为什么第二个不警告?
回复

使用道具 举报

千问 | 2021-1-27 06:18:50 | 显示全部楼层
引用6楼AKK188888881的回复:



为什么?为什么第二个不警告?

第一个编译器知道后面的字符串太长了。
第二个编译器不知道运行时字符串是否太长。
第二个越界读取了字符串,不是不警告,是因为这个警告一直没有纳入C标准,所以有的编译器警告,有的不警告。
回复

使用道具 举报

千问 | 2021-1-27 06:18:50 | 显示全部楼层
puts是遇到'\0'停止输出。e没有'\0',因此会出现越界。
a[0]。strcpy,肯定会越界的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行