问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

字符数组和字符指针的区别

发布网友 发布时间:2022-04-23 05:48

我来回答

2个回答

懂视网 时间:2022-04-09 20:43

测试ftell函数时发现报错,先贴源码

// File Name: ftell.c       
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char** argv)
{
 FILE* fp = fopen("myfile.in", "r");
 if (fp == NULL) {
 perror("fopen error");
 exit(1);
 }
 char buf[4];
 fgets(buf, 4, fp);
 if (fputs(buf, fp) == EOF) {
 perror("fputs error");
 exit(1);
 }
 if (ferror(fp)) {
 perror("ferror");
 exit(1);
 }
 
 return 0;
}

错误信息如下 

技术分享

于是用GDB调试,在fputs处设断点,输出字符数组

技术分享

突然我想查看每个字符的值,于是看到的是这个

技术分享

啊,突然想起来,buf的类型并不是char*,虽然如果作为函数输入参数的话会被当成char*,但是buf的实际类型是char (*)[4]

所以输出的是4个char (*)[4],也就是buf开始的16个字符

但是我使用p &buf[0]@sizeof(buf)会报错Only values in memory can be extended with ‘@‘

想着可能需要类型转换,加了(char*)后还是报错,原来是因为只有值才能狗用@扩展,GDB会取得值的指针,然后用@往前移动

于是几个调试如下

(gdb) p buf
$1 = "lin"
(gdb) p &buf[0]
$2 = 0x7fffffffde90 "lin"
(gdb) p &buf[0]@4
Only values in memory can be extended with ‘@‘.
(gdb) p (char*)&buf[0]@4
Only values in memory can be extended with ‘@‘.
(gdb) p *(char*)&buf[0]@4
$3 = "lin"
(gdb) p *buf@4
$4 = "lin"

是看不到的,除非单独查看那一位的字符

(gdb) p (int)buf[3]
$5 = 0
(gdb) p buf[3]
$6 = 0 ‘00‘

OK,继续解决fputs出错的问题吧。

其实perror显示的信息很完美了,错误原因是Bad file descriptor,在这里文件描述符藏在FILE*指向的对象里,错误也就是fp。

这里我是要把信息输出到屏幕上,所以fputs的第二个输入参数应该是标准输出stdout,而不是我打开的文件指针fp。

由于fopen选择了读取模式,所以无法进行写入。

试着把fopen第二个参数改成"r+",允许写入,结果如下

技术分享

该文本之前第1行是line 01,现在被改成了linlin1,因为读取3个字符时偏移量是3(即‘e‘所在位置),然后又写入了3个字符,所以"lin"替代的是"e 0"。

这里也可以发现,用"r"而不是"r+"来禁止写入能够检查出一些容易忽视的错误。

修改后如下

// File Name: ftell.c 
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char** argv) 
{ 
 FILE* fp = fopen("myfile.in", "r");
 if (fp == NULL) {
 perror("fopen error"); 
 exit(1);
 }
 char buf[4];
 fgets(buf, 4, fp);
 if (fputs(buf, stdout) == EOF) {
 perror("fputs error"); 
 exit(1);
 }
 printf("
file offset: %ld
", ftell(fp));
 if (ferror(fp)) {
 perror("ferror");
 exit(1);
 }
 
 fclose(fp);
 
 return 0;
} 
/* output:
lin
file offset: 3        
*/

  

GDB调试字符数组时指针和数组区别的体现

标签:无法   out   报错   ret   .com   stdout   logs   信息   end   

热心网友 时间:2022-04-09 17:51

首先第一点,非常重要的一点:指针和数组是不同的两个类型!

我们从可以从C语言标准文档中得知:

ISO/IEC 9899:1999 - programing language c

6.2.5 Types

20 .

这说明了什么是数组类型

同样在20 .

说明了什么是指针类型。

在了解了两种类型的基础上,我们了解数组和指针的区别:

数组是一组相同类型对象的集合,指针是对一个对象的引用。

它们在使用中表现出了一定的相同点,但不同点也是很多的:

1,数组直接储存对象,指针则是指向一个对象。

2,数组名不能被赋值,指针变量能。

3,sizeof一个数组,得到数组的长度(字节单位),sizeof一个指针,相当于sizeof(void*)。(注意,不同目标平台指针长度可能不同,所以sizeof(void*)是最准确的回答)

4,(可能是考试内容,对于正确性就呵呵)指针是间接访问,数组是直接访问。

如果你对C语言有深入学习的想法,务必去了解一下C语言的ISO标准。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
刘备与宋江哪个损? 做一个2分钟的flash小动画,我一定加50分 谢谢各位flash高手了 求一个一分钟左右的关于励志奋斗的FLASH动画 “次子论列于朝”的出处是哪里 中华情·走进生态寿光晚会节目单 驾照审核过期了怎么办? 小车d档代表什么意思 学生办理信用卡条件是什么? 农村院子用水泥毯怎样 水泥毯好不好用,水泥毯能取代水泥墙吗 现在越来越多人喜欢安装投影,投影真的比电视好吗? 数组和指针的区别,字符数组和字符串指针区别 C语言字符指针和字符数组的区别 微型投影仪的优缺点都有哪些? 数组和指针的区别,字符数组和字符串指针区 指针与数组 字符指针,字符串和字符数组的区别 苹果手机被水湿了 晾干之后屏幕成黑白的 是什么原 VIVOIQ手机进水了,然后手机出现黑白黑白,有的时候正常,屏幕没坏,屏幕一闪一闪的有时候直接不显? 手机进水了 屏幕成黑白的了 还能抢救吗 OPPOA53手机进水后,照出的照片是黑白的怎么办? 手机掉水里了,不能用了。屏幕变黑白色了,屏幕也点不开了,怎么回事 手机进水再开机的时候屏幕变成黑白的了而且全部不受控制了怎么搞 华为荣耀8c手机页面为什么是黑白色,怎么调回? 苹果手机如果进水了,外面。是好的,里面变成黑白色的怎么办? iphone变成黑白色怎么变回来屏幕进水了换的屏幕小店说是原装屏要了一千块钱面容200屏幕800换_百度问一问 手机进水后变成黑白色怎么办? 女孩梦见指甲陷入手掌里,流血了,指甲也断了,怎么回事 梦见指甲断裂,翻起来了意味着什么啊? 梦到自己手小拇指的指甲断了意味着什么? 醋腌熟鸡蛋治什么? 投影电视优缺点 简述字符串数组和字符指针的区别,举例说明。 电视好还是投影仪好?电视和投影仪的优缺点分别有哪些? c语言字符串数组和字符串指针数组的区别? 现在家里都流行装投影仪了,投影仪相较于液晶电视有什么优势? 字符指针变量和字符数组的区别 字符数组和字符指针的区别与联系 投影仪和电视应该怎么选,分别都有哪些优缺点? C语言中字符串数组与字符指针数组有什么区别?怎么用 投影与显示器的优缺点 C语言中指针定义的字符串和数组定义的字符串的区别 投影仪和电视相比有什么优缺点? 8. 使用字符指针和字符数组表示字符串时,二者有何区别? 有的人喜欢买液晶电视,有人喜欢买投影仪,俩者之间有什么优缺点? C语言中字符串数组与字符指针数组有什么区别 投影仪和液晶电视比较有什么优缺点? 字符串数组和字符串指针的区别? 字符数组名,无名字符串和字符指针有什么区别? 观感体验好,投影仪到底比电视机好在哪里? C++ 字符数组和字符指针