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