2016-05-12 198 views
-5

//////return语句for循环

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]; 
    } 
} 
+0

[请参阅此讨论关于为什么不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+3

请修复缩进,希望你的一半问题得到排序,如果不是更多。\ –

+1

什么是'strlength()'?你为什么使用它而不是标准的'strlen()'? –

回答

1

如果什么string是0长度或count为0?在你的第二种情况下,你不会返回一个值。

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


编辑

好了,问题是更深 - 你永远不会获得到的是,在设置“\ 0”,与这些初始条件环路(“变焦”的部分代码和3 )。因此,您的字符串也可能没有设置终止符,具体取决于malloc的感觉。即使退出for循环,如果有字符串,则需要设置NUL的值。这就是为什么第二个失败,而不是第一个 - 它确实错过了返回声明。

+0

情况并非如此。字符串是“缩放”,计数是3. – onur

+0

它引发编译器警告,并有一个明确的失败情况,它调用你忽略的UB。也就是说,你还没有说出哪一行或什么地方出现了seg-fault。有这将有助于缩小范围。 –

+0

抱歉给您带来不便。我太新手了,我在终端看到的所有内容都是“分段错误(核心转储)”。如果你告诉我我怎么看到哪条线路导致错误,我会非常高兴。 – onur