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

发布网友 发布时间: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"