赋值丢弃指针目标类型的‘const’限定符问题求助
问题原因分析
警告的直接原因
警告出现在extension = file_name;这一行:
file_name是const char *类型,意味着它指向的内存内容不允许被修改;extension是char *类型,它指向的内存内容是可修改的;- 把
const char *赋值给char *,相当于移除了对内存内容的只读保护——编译器担心你之后会通过extension指针去修改原本被const标记为只读的内容,所以抛出discards ‘const’ qualifier警告。
代码中的其他逻辑问题
即使去掉const,代码也无法正确提取扩展名:
- 第一个
for循环未判断字符串结束,若文件名中没有.,会越界访问内存触发未定义行为; extension = file_name;直接修改了传入的指针本身,而非向指针指向的缓冲区复制内容,会丢失原本传入的缓冲区地址,后续赋值操作完全错误;- 第二个循环结束后,
extension已指向字符串末尾,调用puts(extension)会输出空字符串; - 函数声明返回
int,但代码中无任何return语句,违反C语言标准。
修正后的示例代码
#include <stdio.h> #include <string.h> // 返回值:成功提取返回0,无扩展名返回-1 int get_extension(const char *file_name, char *extension, size_t ext_buf_size) { // 定位最后一个'.',处理"file.tar.gz"这类多后缀场景 const char *dot = strrchr(file_name, '.'); if (dot == NULL || dot == file_name) { // 无点或点为首个字符(如".bashrc") *extension = '\0'; return -1; } dot++; // 跳过点,指向扩展名起始位置 // 复制扩展名到缓冲区,避免越界 strncpy(extension, dot, ext_buf_size - 1); extension[ext_buf_size - 1] = '\0'; // 确保字符串终止 puts(extension); return 0; } // 调用示例 int main() { char ext[20]; get_extension("document.pdf", ext, sizeof(ext)); get_extension("archive.tar.gz", ext, sizeof(ext)); get_extension("no_extension", ext, sizeof(ext)); return 0; }
内容的提问来源于stack exchange,提问作者Isma Jr
相关产品推荐
相关产品推荐

