- 以下代码片段中的
if (cmdline[-1] == '\n' && cmdline[-1] == '\0')
的目的是什么?- 在什么情况下会评估为真?
cmdline[-1]
中的负数索引在这里如何工作?我曾在SO上看到类似的问题,但在这里之前没有指针算术。
以下是该代码的伪代码:
parseInfo *parse (char *cmdline) {
parseInfo *Result;
char command[MAXLINE];
int com_pos = -1;
if (cmdline[-1] == '\n' && cmdline[-1] == '\0')
return NULL;
Result = malloc(sizeof(parseInfo));
init_info(Result);
com_pos=0;
/* while (cmdline[i] != '\n' && cmdline[i] != '\0') { */
command[com_pos]='\0';
parse_command(command, 0); /* &Result->CommArray[Result->pipeNum]);*/
return Result;
}
编辑 #1:
为什么在以下情况下会打印出"When does this NOT get printed?":
编辑 #2: 我通过将长度增加1(包括空字符)并将length个字节复制到分配的length个字节中,使cmdline
成为有效字符串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void parse(char *cmdline) {
printf("'%c'\n", cmdline[-1]);
if (cmdline[-1] == '\0' || cmdline[-1] == '\n') {
printf("When does this NOT get printed?\n");
}
}
int main() {
char str[100] = "hello";
const int length = strlen(str) + 1;
char *cmdline = malloc(length * sizeof(char));
strncpy(cmdline, str, length);
parse(cmdline);
return 0;
}
相应的输出如下:
$ gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix
$ gcc negative_index.c
$ ./a.out
''
When does this NOT get printed?
cmdline[-1] == '\n' && cmdline[-1] == '\0'
总是为假。 - BLUEPIXYsize_t
,它通常与unsigned long
相同,那么-1
在unsigned long
中是多少?) - Some programmer dudecmdline[-1]
和*((cmdline)+(-1))
是相同的。如果这不是良好定义的,那么你怎么能从指针中减去一个值呢?--
操作符也会产生未定义行为吗? - PotatoswatterNULL
是一个空指针常量。而空字符'\0'
则是另一回事。 - Keith Thompson