2016-07-20 4 views
0

、コードが正しくprintfは関数の戻り値をどのように変更しますか? printf文<code>printf("new s3 string (in locate function) is "%s" n",s3)</code>で

に動作しますが、printf("new s3 string (in locate function) is \"%s\" \n",s3)がコメントされている場合、コードがreturn値に影響を与えるprintfがいかにnull

を返しますか?

#include <stdio.h> 
#include <string.h> 

char * locate(char * s1,char * s2,int index) 
{ 
    printf("s1 string is \"%s\" \n",s1); 
    printf("s2 string is \"%s\" \n",s2); 

    int i=0,j=0, k; 
    char s3[100];  

    while(i<=index) 
    { 
     s3[i]=s1[i]; 
     i++; 
    } 
    k=i; 

    while(s2[j]!='\0') 
    { 
     s3[i]=s2[j]; 
     i++; j++; 
    } 

    while(s1[k]!='\0') 
    { 
     s3[i]=s1[k]; 
     i++;k++; 
    } 

    s3[i]='\0'; 

    //printf("new s3 string (in locate function) is \"%s\" \n",s3); 

    return ((char *)s3); 
} 


int main(void) 
{ 
    char * s1="my name shwetha"; 
    char * s2="is "; 
    s1=locate(s1,s2,7); 

    printf("Final Inserted string S1 is \"%s\" \n",s1); 

    return 0; 
} 
+0

[Cの関数からローカル変数を返す]の可能な複製(http://stackoverflow.com/questions/4824342/returning-a-local-variable-from-function-in-c) –

答えて

8

s3(それはそれがで作成された機能を残して)スコープの外に出るので、それは行動のいずれかの方法を未定義ました。 mains3を作成し、それを別のパラメータとして渡すか、OSによって管理されるmalloc()経由のヒープ割り当てを使用する必要があります。

+0

ちょっとした提案、 _ "の代わりに" _ "で作成された関数を残します。宣言されている関数が終了するとスタックから解放されたと言うのに適しています。 – ameyCU

1

あなたのコードは、ローカル変数s3へのポインタを返します。そのように宣言されると、範囲外になり(スタックメモリから解放される)、returnになります。プログラマがそれを無視するとき、それはプログラムの未定義の振る舞いの一般的な「ジェネレータ」です。

  1. 他の答えで示唆されているように、変数を動的に割り振る(そして引き続き解放する)ことができます。
  2. それはstatic char s3[100]

、またこのrelated SO postをご覧下さい宣言することで、変数の保存期間を変更します。

+0

char * s4 = s3; return(s4);これも機能しますか? char *はデータセグメントの右に格納されていますか?したがって、関数を終了した後に利用可能になるはずです。 – PyRookie

+0

返された_pointer_にはローカル名@PyRookieだけを渡すので、コンパイラのために変更する必要はありません。より興味がある場合は、アセンブリ言語にコンパイルし、結果のコードを行ごとに比較してみてください。 ( - : – user3078414

関連する問題