C语言字符串转整型数组报指针转整数尺寸不同警告且输出异常
问题根因
- 你代码中
value[k].air是char[28]类型的数组名,C语言中数组名在作为右值使用时会自动隐式转换为指向数组首元素的内存地址指针,你直接对这个指针做(int)强转,本质是把内存地址的数值转成int输出,而非数组中存储的字符串内容。 - 你输出的异常大数值恰好是结构体数组中每个元素的
air字段的内存首地址,可验证:相邻两个输出值的差是168,刚好等于你的结构体arr的总大小(6个长度为28的char数组:28*6=168),和结构体数组的内存排布完全吻合。 - 触发警告的原因:64位系统下指针长度为8字节,而int通常为4字节,将8字节的地址强转为4字节的int会出现精度截断,因此编译器抛出
cast from pointer to integer of different size警告。
修正方法
如果你需要将air字段存储的数字字符串转换为整数,不要直接强转数组名,使用C标准库提供的字符串转整数函数即可:
- 如果要将读取到的所有行的
air字段转成整数,修改循环逻辑如下:
// 最多存储999行的air字段整数值 int sum1[999]; for (int k = 0; k < i; k++) { // atoi接收char*类型的字符串指针,返回对应的整数值 sum1[k] = atoi(value[k].air); printf("%d\n", sum1[k]); }
- 如果你是要取某一行
air字段的单个字符的ASCII值,需要指定数组下标访问单个字符:
// 示例:取第一行air字段的第k个字符的ASCII值 sum1[k] = (int)value[0].air[k];
内容的提问来源于stack exchange,提问作者Ayushman
相关产品推荐
相关产品推荐

