2017-06-12 5 views
-2

helloeveryone。私はプログラミングにはまだまだ慣れていませんし、現在はどのプロジェクトでもC言語のプログラミングを進めていきたいと考えています。私はmallocとreallocの使い方を学んだだけで、多次元配列から2つの文字列を結合するためにstrcatを使用しようとするまでは、すべてうまく見えました。多次元配列でReallocとstrcatを使用すると文字が欠落していますか?

ユーザーの入力に基づいて2つの文字列の組み合わせを取得するはずです。不思議なことに、最初の文字が欠落しているか、他の文字に置き換えられています... ソースコードと出力。私は本当に助けていただきありがとうございます。前もって感謝します!! (最後に韓国語を気にしない...私は韓国人だ:P)

enter code here 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 


int main(void) 
{ 
int i, j; 
const int row = 3; 
char *pstr[3]; 
char temp[100]; 
int k,p = 0; 




printf("Type in any three characters\n"); 
for (i = 0; i < row; i++) 
{ 
    pstr[i] = (char *)malloc(strlen(temp) + 1); //initialize the lenght of the elements in 2 part of 2D array of char b[ROW] via length of the given string 
} 
for (i = 0; i < row; i++) 
{ 
    scanf("%s", temp); 
    strcpy(pstr[i], temp); 
} 
printf("\n"); 

for (i = 0; i < row; i++) 
{ 
    printf("%s\n", pstr[i]); 
} 

    scanf("%d", &p); 
    scanf("%d", &k); 

printf("%s\n", pstr[p]); 
printf("%s\n", pstr[k]); 

*pstr[k] = (char *)realloc(pstr[k], strlen(pstr[p])+100); 

strcat(pstr[k], pstr[p]); 
printf("%s", pstr[k]); 


for (i = 0; i < row; i++) 
{ 
    free(pstr[i]); 
} 

return 0; 
} 

\出力:: LINK IS AN INTERNATIONAL SIGN FOR , IMAGE OVER HERE!!!

+0

コードには多次元配列はありません!ポインタは配列ではありません。 – Olaf

+0

テキストの画像を投稿しないでください! – Olaf

+0

@ tilz0R:リンクを提供してみませんか?しかし、キャストが正当化される理由は、新しい、良い共鳴を持っているかもしれません。 – Olaf

答えて

1

2つの大きな問題:あなたはtempを使用

  1. 初期化される前に、その内容が不定であり、それがの未定義の動作につながる場合。

  2. *pstr[k] = realloc(...)を実行すると、pstr[k]にポインタが逆参照され、最初の要素が得られます。これは1文字です。次に、このchar要素にreallocコールの結果を割り当てます。したがって、基本的に実際のポインタは失われ、pstr[k]は同じメモリを指しています(無効になっている可能性があります)。

これらの2つが最悪です。

+0

答えをありがとう。あなたが言ったようにコードを変更しました。エラーが発生したので、strlenも変更しました。しかし、私はまだstrlenを使いたいと思っています。それを行う方法はありますか? –

+0

ああ... nv心。私はちょうどそれを感謝した。私はそれがかなり愚かな質問だったと思う今私は振り返る –

0

私はあなたのコード

1でこれらを発見した)Kまたはpが2以上である場合には、ランタイムエラーに

2を与える)*pstr[k] = (char *)realloc(pstr[k], strlen(pstr[p])+100);

が、このラインはまた、コンパイル時にエラーを与えることができます(MAC少なくとも) - 彼らは 同じではありませんように、あなたは次のように変更される可能性があり -

*pstr[k] = *(char *)realloc(pstr[k], strlen(pstr[p])+100); 

3)のrealloc必要になりますGEの後tの例外は無料です。これを参照してください - How free memory after of realloc

関連する問題