【发布时间】:2011-03-10 09:24:28
【问题描述】:
我有一个void *,叫它data,我知道它的长度,但不是以空结尾的。我拨打这样的电话snprintf(line, sizeof(line), "%*s", n, (const char*)data),其中n 是已知长度。几乎总是这样,但偶尔会导致段错误。
每当发生段错误时,回溯都会表明问题出在 strlen 内部。当我在 gdb 中打印 data 时,我看到了类似这样的内容
(gdb) p n
$1 = 88
(gdb) p (const char*) data
$2 = 0x1d752fa8
"JASDF" ... "ADS"<Address 0x1d753000 out of bounds>
(gdb) p 0x1d753000-0x1d752fa8
$3 = 88
data 确实是 88 个字符,但不是以 null 结尾的,事实上,它似乎正好靠在一个段上。我的猜测是 snprintf 在数据上总是被称为 strlen ,我通常很幸运,即使data 不是以空值终止的,在我点击该段之前有一个\0 ,然后偶尔我会不走运,它是。那正确吗?如果是这样,解决方法是什么?
这就是堆栈跟踪的样子
#0 0x0000003c8927839e in strlen () from /lib64/libc.so.6
#1 0x0000003c89246749 in vfprintf () from /lib64/libc.so.6
#2 0x0000003c8926941a in vsnprintf () from /lib64/libc.so.6
#3 0x0000003c8924d0a3 in snprintf () from /lib64/libc.so.6
编辑为了回答我自己关于变通的问题,strncpy 是一个更适合调用的函数。我习惯使用 snprintf。
【问题讨论】:
标签: c segmentation-fault strlen printf