2017-02-02 10 views
1
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

void catTo(char *dest, const char *str1, const char *str2) 
{ 
    dest = (char *) malloc(1 + strlen(str1)+ strlen(str2)); 
    strcpy(dest, str1); 
    strcat(dest, str2); 
} 

int main(int argc, char** argv) { 
    char *str1 = "abcd"; 
    char *str2 = "defg"; 
    char *dest; 
    catTo(dest, str1, str2); 
    printf("%s",dest); 

    return 0; 
} 

私はdestを出力するときに単純なstrコピー関数を取得しようとしていますが、 "(null)"を取得します。私は、特定の変数の前に入れてみようとしましたが、無効にしました。nullを返すポインタを持つC文字列関数

+2

'無効catTo(のchar *のDESTを、': 'dest'は、あなたの関数の外に変更されることはありません –

+0

をコンパイルするときに、いつも。すべての警告を有効にしてから、これらの警告を修正してください( 'gcc'の場合は最低でも-Wall -Wextra -pedantic' -Wconversion -std = gnu99'を使用します) – user3629249

+0

ヒープメモリ(malloc、calloc、realloc)1)戻り値をキャストしないでください。型は既に 'void *'であるため、他のポインタに代入することができます。キャスティングはコードを混乱させ、理解し、デバッグし、維持することをより困難にします。 2)操作が成功したことを保証するために返された値を常にチェックする(!= NULL) – user3629249

答えて

4

入力パラメータとしてを渡しません。その開始値は必要ではなく(未定義)、catTo関数呼び出しによって変更されないため、問題が説明されます。

char *catTo(const char *str1, const char *str2) 
{ 
    char *dest = malloc(1 + strlen(str1)+ strlen(str2)); 
    strcpy(dest, str1); 
    strcat(dest, str2); 
    return dest; 
} 

と、呼び出し元で:

ベターこれを行う

char *dest = catTo(str1, str2); 
+0

'' char dest = /*...*/'''を '' catTo' 'と書いていましたか?もちろん –

+0

!一定。 –

4

を私は特定の変数の&/*インフロントを置くことをいじり、しようとしたが、ありません勝つまで。

これは問題を解決するひどい方法です。コードに演算子をランダムに追加するのではなく、ポインタと値のセマンティクスに関する知識を確認する必要があります。

にかかわらず、問題はあなたがchar*としてdestを渡した後、destcatTo内側に代入しているということです:あなたはdestをコピーしているので、あなたがいないmainに存在destインスタンスに、ローカル引数に代入しています。あなたがchar**としてdestを渡すことで、この問題を解決することができ

void catTo(char **dest, const char *str1, const char *str2) 
{ 
    *dest = malloc(1 + strlen(str1)+ strlen(str2)); 
    strcpy(*dest, str1); 
    strcat(*dest, str2); 
} 

int main(int argc, char** argv) { 
    char *str1 = "abcd"; 
    char *str2 = "defg"; 
    char *dest; 
    catTo(&dest, str1, str2); 
    printf("%s",dest); 

    return 0; 
} 

また、すべてのmallocは、対応するfreeによって一致する必要があります。あなたがmainにそれで終わったらfree(dest)を呼び出すことを忘れないでください:

int main(int argc, char** argv) { 
    char *str1 = "abcd"; 
    char *str2 = "defg"; 
    char *dest; 
    catTo(&dest, str1, str2); 
    printf("%s",dest); 
    free(dest); 

    return 0; 
} 
+1

mallocのchar * castは必要ありません: '(char *)malloc' =>' malloc' –

+0

@ Jean-FrançoisFabre:良い点、それを削除しました。 –

+0

@ Jean-FrançoisまだJavascriptのレベルの忍耐はないが、かなり近い! – Quentin

関連する問題