什么是"返回p?memcpy(p,s,len):NULL;" 意思?

Sen*_*sor 0 c ternary-operator conditional-operator

什么意思是" 返回p?memcpy(p,s,len):NULL; "在下面的代码中?(更一般地说,条件运算符是什么,a ? b : c?)

char * strdup(const char * s)
{
  size_t len = 1+strlen(s);
  char *p = malloc(len);

  return p ? memcpy(p, s, len) : NULL;
}
Run Code Online (Sandbox Code Playgroud)

mac*_*fij 6

此语法称为三元运算符,您可以将其视为简化的if语句.return p ? memcpy(p, s, len) : NULL;是相同的:

if(p)
    return memcpy(p, s, len);
else
    return NULL;
Run Code Online (Sandbox Code Playgroud)

memcpy()函数返回一个指向dest的指针,这是memcpy的第一个参数,在你的情况下,这是p.因此,如果p值不同于0(指针不为NULL),则返回该指针.否则,返回NULL.


GKF*_*KFX 5

这意味着执行和返回memcpy(p, s, len),除非p==0.如果p==0,它将返回NULL,而不是执行memcpy(p, s, len).

阅读https://en.wikipedia.org/wiki/%3F:#C了解更多信息.

另外,用http://man7.org/linux/man-pages/man3/memcpy.3.html来解释:memcpy()函数将len个字节从内存区域p复制到内存区域s.内存区域不得重叠.

也就是说,如果我们有以下记忆:

   p            s
[][1][2][3][][][4][5][6][]
Run Code Online (Sandbox Code Playgroud)

和len == 3,然后当调用memcpy时,我们得到:

   p            s
[][1][2][3][][][1][2][3][]
Run Code Online (Sandbox Code Playgroud)

最后,函数返回的值是它在表达式中使用它时计算的值; 如果foo()返回5,则print(foo());打印5.