2017-06-04 4 views
0

n文字にそれらを完了する配列の各文字列に'.'文字を配置する関数を作成しようとしています。 そして、私はtmp stingをstrcpyでもポインタでも配列の文字列にコピーできないことを除いて、うまくいきます。 コードは次のとおりです。文字列の配列内のstrcpy

void foo (char **t, int count, int n) { 
    int max = 0, i, j; 
    char *tmp; 
    for (i = 0; i < count; i++) { 
     if (max < strlen (t[i])) max = strlen (t[i]); 
    } 
    if (max > n) return; 
    for (i = 0; i < count; i++) { 
     int diff = n - strlen (t[i]); 
     tmp = (char *) malloc (diff * (sizeof (char) * n + 2)); 
     for (j = 0; j < diff; j++) { 
      tmp [j] = '.'; 
     } 
     tmp [j] = '\0'; 
     strcat (tmp,t[i]); 
     t[i] = (char *) realloc (t[i], strlen (tmp) + 10); 
     strcpy (t[i], tmp); 
     //*(t + i) = *tmp; <- I tried this method too 
     free (tmp); 
    } 
} 

だからそれがうまく実行されている(2つの文字列を連結し)、strcpy (t[i], tmp);コマンドまで。 私は何が間違っていますか?

(私が知っている、私は不必要に大きなスペースを確保し、私はそれを確認するために行う。)

私はそれが使用するmain()機能:

int main() 
{ 
    char *t[3] = {"string", "foo", "help"}; 
    int i; 
    foo(t, 3, 10); 
    for (i = 0; i < 3; ++i) 
     printf("%s\n", t[i]); 
    return EXIT_SUCCESS; 
} 

それはコンパイルエラーを与えていない、また警告。

実行時にクラッシュし、-1073741819(0xC0000005)を返します。何も印刷しません。

私はCodeBlocksを使用しています。

+0

'strcpy'は、バッファオーバーフローによって悪用される可能性があるため、安全ではありません。 – arboreal84

+0

t配列に結果を格納するのに十分なスペースがない可能性があります。 –

+1

@ arboreal84 'strcpy'は、第2引数が' \ 0 'で終わっていて、最初の引数に十分なスペースがあることを証明できれば、完全に安全です。 't [i] =(char *)realloc(t [i]、strlen(tmp)+ 10);'これがそうであることを示唆します。 –

答えて

-1

説明をまとめると、の文字列リテラルに変更しようとしています。

文字列リテラルはで、読み取り専用はです。文字列リテラルをconst char *に割り当てることのみを許可することは論理的です。残念ながらで、文字列リテラルをchar *に割り当てることができます。それでも、変更することはできませんので、変更しようとすると、の定義されていない動作であり、実行時にクラッシュする可能性があります。

これは、文字列リテラルのアドレスrealloc()にも試みると、やはり簡略化されます。 realloc()は、既に動的に割り当てられたオブジェクト(malloc(),calloc()またはrealloc()を使用)でのみ許可されます。他のすべては未定義の動作です。

あなたの場合、すべてのコピーを取り、これらのコピーを返すだけです。

+0

downvoterに:「コミュニティウィキ」をチェックした理由があります - OPに違うミスがありました。それらはすべて正しくコメントされていますが、理解しやすい方法で説明するのは簡単ではありません。だから、ただdownvoteだけでなく、改善するために自由に感じてください:) –

関連する問題