c - c中的strlen返回负结果

标签 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

最佳答案

只是你不能使用GDB:P

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

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

关于c - c中的strlen返回负结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18080460/

相关文章:

c - C警告(clang编译器)“整数文字太大,无法用有符号整数表示”

c++ - 为什么我们可以在 C 中写越界?

linux - 在 Bash 脚本中过滤类型错误的正确方法是什么?

erlang - 获取有效 system_info 原子的完整列表

c - C 中带条件的 Goto 语句

c - librdkafka C API Kafka 消费者无法正确读取所有消息

php - laravel 路由在 linux 中不工作,但在 unix 中工作

linux - 使用通配符和 grep

c - 为什么存在系统调用

c++ - 系统调用失败 "Incorrect Section Name -e"C++