C fprintf有长度限制吗?
A在Linux版本2.6.32-431.11.2.el6.x86_64中有下一个c ansi代码C fprintf有长度限制吗?,c,linux,core,C,Linux,Core,A在Linux版本2.6.32-431.11.2.el6.x86_64中有下一个c ansi代码 fprintf(fpOut, "%s",cBuffer); 其中cBuffer是指向char的指针,如中所示 int bfnAddOutputFile(FILE *fpOut, char *cBuffer){/**/ fprintf(fpOut, "%s",cBuffer); //code return ( TRUE );
fprintf(fpOut, "%s",cBuffer);
其中cBuffer是指向char的指针,如中所示
int bfnAddOutputFile(FILE *fpOut, char *cBuffer){/**/
fprintf(fpOut, "%s",cBuffer);
//code
return ( TRUE );
}
当它执行fprintf时,会生成一个内核转储
Program received signal SIGSEGV, Segmentation fault.
0x00000038b2e6723e in fputs () from /lib64/libc.so.6
有一个最大长度的字符可以发送给fprintf,如果它是什么数字?
cBuffer
可能不包含空终止符,这会使fprintf
超出内存边界
在输出C字符串时,
printf
-系列函数仅在遇到空终止符('\0'
)时停止,否则可以继续,直到它们尝试输出不属于您的程序的内存块,从而导致分段错误 是cBuffer
ASCIIZ字符串吗?不清楚为什么会崩溃,因此为什么您认为这是一个长度问题?请参阅此相关文章。您的字符串可能没有以空字节结尾。替换fprintf(fpOut,“%s”,cBuffer)代码>带有printf(“%zd\n”,strlen(cBuffer))
并查看错误是否仍然发生。你是说strlen
,@squeamishossifrage?如果是这样,(1)strlen()
可能会遇到同样的问题,(2)正确的字段描述符应该是%zx
,而不是%xd
。虽然不是OP的情况,[f|s]printf
可以在遇到字符串终止符之前停止(如果给定了字段宽度)。cBuffer太小,所以fprintf中不包含空终止符。@JohnBollinger怀疑您指的是精度,而不是字段宽度。没错,@chux。printf
-系列函数输出的字符串参数字符数不会超过字段精度,而不是宽度。例如,可以使用如下内容:fprintf(fpOut,%.255s,cBuffer)代码>。