【问题标题】:Assignment of char value causing a Bus errorchar 值的分配导致总线错误
【发布时间】:2013-05-17 21:20:23
【问题描述】:

函数是反转一个C字符串:

void reverse(char[] str){

char *start = str;
char *end = str;
char tmp;

if (str) {

    while (*end) {
        end++;
    }

    end--;

    while (&str > &end) {

        tmp = *str;

        *str = *end;
        str++;
        *end=tmp;
        end--;
       }
    }

}

在最后一个while循环中,当我将*end分配给*str时,这条线导致总线错误,谁能解释一下原因?

顺便说一句,a 和有什么区别 char[] temp 和 char temp[]?

【问题讨论】:

  • 发布错误的全文通常被认为是一种好的形式
  • 你怎么称呼reverse
  • char[] tempchar temp[] 的区别在于后者是有效的 C 而前者不是。你的代码甚至不应该编译。
  • OP:不要就地编辑您的代码——它会使 cmets 和答案无效。如果您想进行更新,请添加单独的部分。
  • 见上面 Basile 的问题。也许您正在尝试反转字符串文字……这在成千上万将反向代码发布到 SO 的新手中很常见。

标签: c char


【解决方案1】:

这个循环条件:

while (&str > &end)

错了。你不想要& 操作符,你也有它倒退。使用:

while (str < end)

除此之外,正如我在上面的评论中提到的,您还需要正确声明您的函数签名:

void reverse(char str[])

【讨论】:

    【解决方案2】:
    while (&str > &end) {
    

    这条线是错误的。 & 产生地址,并且这些指针变量的地址在循环期间不会改变。你不想要指针的地址,你想要它们的值,并且你想要循环直到开始到达结束,所以:

    while (str < end) {
    

    或者

    while (start < end) {
    

    并酌情将str 的其他实例更改为start ...或删除未使用的start 变量。

    顺便说一句,char[] temp 和 char temp[] 有什么区别?

    前者是不合法的 C.

    更新:

    新发布的代码看起来不错,但如果参数无效或不可写,则其行为未定义......例如,字符串文字。完整的答案需要您发布 Short, Self Contained, Compilable Example.

    【讨论】:

    • 你能详细解释一下为什么那条线路会导致总线错误吗?
    • 您能解释一下您的回答与卡尔的评论和回答有何不同吗?
    • @0x90 你能解释一下为什么你要制作非实质性的 cmets 吗?在卡尔的帖子发布之前,我就开始写我的答案了……它经常发生在 SO 上。
    • @FangBoy 因为 &str > &end 始终为真或始终为假,具体取决于 str 相对于当前堆栈的位置...这些值在循环期间不会改变,因此循环不会't run 或者它“永远”运行,当 str 和/或 end 指向未分配的内存时会崩溃。
    • @JimBalter 它确实发生了,但我认为您可以将您的输入添加到答案中,因此 IMO 这是一个实质性评论,+1 表示评论的答案。
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多