我正在用C练习,让自己了解这个话题。我正在尝试使用我的程序来操作头文件;但程序返回"分段错误"。我已将问题隔离到以下代码段。任何人都可以帮我看看它到底出了什么问题吗?
header=strtok(st,"\"");
header=strtok(NULL,"\"");
f=fopen(header,"r");
if(f)
{
while((ch=fgetc(f))!=EOF)
fputc(ch,f2);
fclose(f);
}
else
{
header2=(char *)malloc(strlen("/usr/include")+strlen(header));
header2=strcat("/usr/include/",header);
f=fopen(header2,"r");
printf("%s\n",header2);
while((ch=fgetc(f))!=EOF)
fputc(ch,f2);
fclose(f);
}
我注意到只有在我尝试访问/ usr / include / location时才会出现此问题。某种身份验证问题?如果是这样,怎么过来呢?提前致谢。 :)
答案 0 :(得分:3)
您不能将字符串文字用作strcat
的目标 - 字符串文字不可修改,并且没有足够的空间来容纳连接字符串。将变量与前缀组合的更好方法是使用sprintf
。
header2 = malloc(strlen("/usr/include/")+strlen(header)+1);
sprintf(header2, "/usr/include/%s", header);
请注意,调用malloc()
时需要在组合长度上加1,以便为尾随空字节留出空间。
您还可以使用strcpy
后跟strcat
:
strcpy(header2, "/usr/include/");
strcat(header2, header);
答案 1 :(得分:2)
主要问题在于
header2=strcat("/usr/include/",header);
当您提供string literal作为目的地时。这没有任何空间来保存连接的字符串。因此,您实际上是在尝试访问调用undefined behavior的无效内存。
那就是说,对于strcat()
,行为是,(强调我的)
strcat()
函数将src
字符串附加到dest
字符串,覆盖终止空字节('\0'
)dest
,[...]
,在您的情况下,涉及尝试修改字符串文字,再次调用UB。
然后,还有更多要指出,比如
strlen()
不计算字符串的终止空字节,因此使用strlen()
分配内存应包含+1
作为大小以获得空终止的空间。
Please see this discussion on why not to cast the return value of malloc()
and family in C
.
fopen()
等库调用的返回值是否成功。