C 段错误问题:如果两个输入之一为空,则返回另一个

问题描述 投票:0回答:1

我有一个函数,它接受两个字符串并返回另一个字符串(如果你必须知道,它是我的 strjoin 实现)。

现在,我想要这样做,如果其中一个输入字符串为 NULL,它将返回另一个字符串。

我想到的最直接的方法就是简单

if (!str1)
    return (str2);
if (!str2)
    return (str1);

但后来我想,让我们更进一步,尝试节省几行代码并在这个过程中学习一些东西。所以我想一定有某个运算符的结果是两个值中不为零的一个,并且我偶然发现了按位或运算符(|)。 当我尝试实现以下代码时,它说这些运算符仅适用于整数类型值,我想这有点道理,但我想知道是否有一种方法可以用非-整数:)

if (!(str1 && str2))
    return (str1 | str2)
// error: expression must have integral type C/C++(31)

现在,因为问题出在数据类型上,我想我只需将其类型转换出来即可。所以我把它改成了

if (!(str1 && str2))
    return ((char *)((int)str1 | (int)str2))
// segfault 

它并不漂亮,但我认为它会以某种方式起作用。发生的事情实际上是一个段错误!但老实说,我无法解释为什么这会导致段错误 O_o 有人可以解释一下吗?

编辑:我知道我也可以使用三元运算符,但在我的学校这是禁止的:(

EDIT2:仅供参考,我知道我想做的一切都不是一个好主意,我永远不会在真正的代码中尝试这个。请理解这是出于教育目的,我只是想探索可能性,因为这就是人们学习的方式。

c string type-conversion segmentation-fault bitwise-operators
1个回答
0
投票

这个问题:

if (!(str1 && str2))
    return ((char *)((int)str1 | (int)str2));

int
不一定与指针大小相同。 这意味着强制转换会丢失指针的部分值。

uintptr_t
类型是一种无符号类型,保证允许在指针类型之间进行转换,同时保留原始指针值,因此请改用它。

if (!(str1 && str2))
    return ((char *)((uintptr_t)str1 | (uintptr_t)str2));
© www.soinside.com 2019 - 2024. All rights reserved.