2012-02-23 7 views
0

ランダムな名前を生成する関数を記述しました。これは私のコード文字配列を返す

char *getrandumstring(int n) 
{ 
    int i; 
    char *str; 

    for(i=0;i<n;i++) 
    { 


    str[i] = (rand() % 26) + 'a'; 
    } 

    str[i]='\0'; 

    return str; 
} 

今すぐラインに

str[i] = (rand() % 26) + 'a'; 

がセグメンテーションフォールトを取得しています。どうして?

答えて

1

ポインタを作成しているときに、ポインタのバッキングストレージが割り当てられていないため、セグメンテーション違反が発生しています。

char *getRandomString (int n) { 
    int i; 
    char *str = malloc (n + 1); 
    if (str != NULL) { 
     for (i = 0; i < n; i++) 
      str[i] = (rand() % 26) + 'a'; 
     str[n] = '\0'; 
    } 
    return str; 
} 

上記のコードは、メモリを正常に割り当ててバッファを返します。または、使用可能なメモリがない場合、NULLを返します。あなたが終わったらそれを解放することを忘れないでください。また

、あなたにもバッファを提供するために、呼び出し元を取得し、動的メモリ割り当てを使用しない場合:

void getRandomString (char *str, int n) { 
    int i; 
    for (i = 0; i < n; i++) 
     str[i] = (rand() % 26) + 'a'; 
    str[n] = '\0'; 
} 

// Somewhere else in your code: 

#define STR_SZ 20 
char buffer[STR_SZ+1]; 
getRandomStr (buffer, sizeof(buffer) - 1); 
+0

はありがとうございました。私は2番目を使いました。しかし、最初のものも理解しました。 – Heartly

関連する問題