c中的strlen返回否定结果

时间:2013-08-06 12:40:36

标签: c unix system

程序代码段: -

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

3 个答案:

答案 0 :(得分:7)

只是你不能使用GDB:P

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

GDB显示 下一行要执行。 因此,当您打印n时,它尚未初始化。在打印n <enter>之前再次写n

答案 1 :(得分:-1)

你不需要使用strlen,因为snprintf返回打印的字符数,如果缓冲区足够大以适应所有字符,包括终止\0Source由@Casey在评论中提供(可能)。

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

答案 2 :(得分:-3)

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