2

程序片段:-

if((fd = open(buf_serv, O_RDONLY)) < 0) {
    char c[MAXLEN+1];
    snprintf(c, sizeof(c), ": can't open, %s\n", strerror(errno));
    n = strlen(c);

...

gdb :-
102     if((fd = open(buf_serv, O_RDONLY)) < 0) {
(gdb) n
104        snprintf(c, sizeof(c), ": can't open, %s\n", strerror(errno));
(gdb) p sizeof(c)
$1 = 4097
(gdb) n
105        n = strlen(c);
(gdb) p strlen(c)
$2 = -1428323296
(gdb) n
...

谁能告诉我 strlen 是如何返回负数的?(这是用 sigsegv 信号使我的程序崩溃)

提前谢谢大家!

(gdb) l
101
102     if((fd = open(buf_serv, O_RDONLY)) < 0) {
103        char ch[MAXLEN+1];
104        write(STDOUT_FILENO, "foo", 3);
105        sprintf(ch, ": can't open, %s\n", strerror(errno));
106        n = strlen(ch);
107        write(writefd, ch, 100);
108     } else {
109        while((n = read(fd, buf_serv, MAXLEN)) > 0) {
110             write(writefd, buf_serv, n);
(gdb) p ch
$1 = ": can't open, No such file or directory\n", '\000' <repeats 4056 times>
(gdb) p strlen(ch)
$2 = -1428323296
4

3 回答 3

8

只是你不能使用 GDB :P

(gdb) n
105        n = strlen(c);
(gdb) p strlen(c)

GDB 显示要执行的下一行。所以在你打印的时候n,它还没有初始化。n <enter>打印前再写一次n

于 2013-08-06T12:46:44.573 回答
-1

您不需要使用 strlen 因为 snprintf 返回打印的字符数,如果缓冲区足够大以容纳包括 terminating 在内的所有字符\0。@Casey 在评论中提供的来源(可能)。

所以一定要检查返回值是否不是负数并且小于缓冲区大小。还要检查编译器提供的函数文档,因为实现可能会有所不同。

于 2013-08-06T13:11:55.277 回答
-3

strlen()返回某些编译器上字符串之间的差异。因此,例如,如果strlen("a","b")存在,那么这将返回 1;而strlen("b"... 注意:原始答案被截断

于 2013-08-06T12:49:13.230 回答