【问题标题】:return statement in a for loop [closed]for循环中的return语句[关闭]
【发布时间】:2016-09-08 18:28:26
【问题描述】:

//////

char* duplicate(char* string, int count)
{
    char* duped = (char*) malloc( sizeof(char)*(count*strlength(string)+1) );
    int i=0,j=0,t=0;
    for( i=0; i<count*strlength(string); i++,j++ )
    {   
        if (j==(strlength(string))) 
        {
            j=0; 
            t++;
        }

        if (t==count) 
        {
            duped[i] = '\0'; 
            break;
        }

        duped[i] = string[j];
    }

    return duped;
}

上面的代码完美运行,但下面的代码给出了分段错误。它们之间有什么区别?函数在看到返回时不应该停止吗?

char* duplicate(char* string, int count)
{
    char* duped = (char*) malloc( sizeof(char)*(count*strlength(string)+1) );
    int i=0,j=0,t=0;
    for( i=0; i<count*strlength(string); i++,j++ )
    {   
        if (j==(strlength(string))) 
        {
            j=0; 
            t++;
        }

        if (t==count) 
        {
            duped[i] = '\0'; 
            return duped;
        }

        duped[i] = string[j];
    }
}

【问题讨论】:

标签: c for-loop return


【解决方案1】:

如果string 的长度为0 或count 的长度为0 怎么办?在第二种情况下,您不返回值。

这应该会给出一个编译器警告,并且可能会导致崩溃,因为它会返回它想要的任何内容。


编辑

好吧,问题更深了——你永远不会到达那些在 for 循环中使用这些初始条件(“缩放”和 3)设置“\0”的代码部分。因此,根据malloc 的感觉有多好,您的字符串也可能没有设置终结符。如果有字符串,即使退出 for 循环,也需要设置 NUL 值。这就是为什么第二个失败而不是第一个 - 它确实缺少 return 语句。

【讨论】:

  • 事实并非如此。字符串为“缩放”,计数为 3。
  • 它会抛出编译器警告,并且有一个明确的失败案例,它会调用您忽略的 UB。也就是说,您还没有说哪条线路或发生段错​​误的位置。这样做有助于缩小范围。
  • 很抱歉给您带来不便。我只是太新手,我在终端中看到的只是“分段错误(核心转储)”。如果您告诉我如何查看导致错误的行,我会非常高兴。
  • 我拿了你的代码并在一个在线编译器上运行它,它确实到达了你的函数的底部并且失败了 - 我的猜测是因为编译器在它返回时可以做它想做的任何事情一个没有正确返回路径的函数。在函数底部放置一个 return 来处理这个问题,我相信它会为你工作。
  • .....函数底部的返回that returns a value
最近更新 更多