如何用<string.h>的strcat()拼接指针指向的字符串?代码报错咨询
问题分析与修复方案
咱们一步步拆解你代码里的问题:
一、strcat处错误的核心原因
你这里的错误不止一个,是多个问题叠加导致的:
- 参数类型完全不符:
strcat要求两个参数都是char*(指向字符串的指针),但你用*inputchar和*absolutepath把指针解引用成了单个字符,这完全不符合函数的参数要求,编译器直接就会报错。 - 内存分配严重不足:你只给
inputchar和absolutepath分配了1字节的内存(sizeof(char)就是1),别说存文件名和路径了,连字符串必须的结束符'\0'都放不下,后续的输入和拼接操作一定会触发内存越界,属于未定义行为。 - 指针被错误覆盖导致内存泄漏:你先给
absolutepath分配了堆内存,紧接着又把它赋值为字符串常量"D:\\Files\\",这会让之前malloc的内存地址彻底丢失,造成内存泄漏;而且字符串常量是只读的,就算你参数传对了,往里面拼接内容也会触发错误。
二、fopen里用解引用运算符是否正确?
完全错误!fopen的第一个参数需要的是指向路径字符串的指针(const char*类型),inputchar本身就是这个指针,直接传inputchar就行。如果你传*inputchar,本质上是把字符串的第一个字符传进去,这根本不是有效的文件路径,程序肯定无法正确打开文件。
三、修正后的示例代码
我给你改了一份更安全、正确的代码,你可以参考:
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { // 分配足够的内存,这里假设文件名最多255字节,路径缓冲区留足空间 char *inputchar = malloc(256); char *absolutepath = malloc(512); FILE *filepointer; // 检查内存分配是否成功,避免空指针操作 if (inputchar == NULL || absolutepath == NULL) { perror("malloc failed"); return 1; } // 先把基础路径复制到堆内存的absolutepath中 strcpy(absolutepath, "D:\\Files\\"); printf("Enter filename: "); // 用fgets替代不安全的gets,避免缓冲区溢出 fgets(inputchar, 256, stdin); // 去掉fgets自动读取的换行符 inputchar[strcspn(inputchar, "\n")] = '\0'; // 正确拼接字符串:目标是absolutepath,追加inputchar的内容 strcat(absolutepath, inputchar); // 直接传指针给fopen即可 filepointer = fopen(absolutepath, "r"); if (filepointer != NULL) { // 这里可以添加你需要的文件操作逻辑 printf("File opened successfully!\n"); fclose(filepointer); } else { perror("Failed to open file"); } // 释放堆内存,避免泄漏 free(inputchar); free(absolutepath); return 0; }
额外注意事项
- 永远别用
gets,它完全不做缓冲区边界检查,是非常危险的函数,用fgets替代更安全。 - 每次调用
malloc后一定要检查返回值是否为NULL,避免空指针访问崩溃。 - 字符串拼接前,必须确保目标缓冲区有足够的剩余空间,否则会触发内存越界。
- 字符串常量是只读的,不要试图修改它们,也别让堆指针被赋值为字符串常量,否则会丢失堆内存地址造成泄漏。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

