0

こんにちは、char * ポインターを char [] 配列にコピーしようとしています。

これはこれまでの私のコードです

char * string_add(char * base, char * toAdd)
{
    char * string=malloc(strlen(base)+streln(toAdd)+1);
    sprintf(string,"%s%s",base,toAdd);
    char returnString[strlen(string)+1]; 
    // here comes my problem:
    memcpy(returnString,string,strlen(string)+1);
    // want to add free(string) here
    return returnString;
}

このような関数を使用してコードを保存したいと考えています。割り当てられたすべてのメモリの世話をしたくありません。私も試しました

memcpy(&returnString,string,strlen(string)+1);

および strcpy と strncpy を使用したいくつかのバリアント。しかし、次の問題は解決しません。

次のように関数を 2 回呼び出す場合:

int main(int argc, char * argv[])
{
    char * str1=string_add(argv[1],"-test1"); 
    char * str2=string_add(argv[1],"-test2"); 
    printf("%s, %s", str1,str2);
}

出力は次のようになります。

abc-test2, abc-test2

どうすればこれを理解できますか?

前もって感謝します!

4

5 に答える 5

3

C では、malloc されたメモリを管理する必要があります。宣言している char 配列はスタック上にあり、関数が戻った後になくなります。malloc メモリだけがハングします。そしてはい、あなたはそれを世話し、きれいにする必要があります.

于 2013-08-18T21:24:06.013 に答える
0

関数では

char * string_add(char * base, char * toAdd)
{
    char * string=malloc(strlen(base)+streln(toAdd)+1);
    sprintf(string,"%s%s",base,toAdd);
    char returnString[strlen(string)+1]; 
    // here comes my problem:
    memcpy(returnString,string,strlen(string)+1);
    // want to add free(string) here
    return returnString;
}

あなたが定義しますreturnString[]が、それは関数のスコープ内にのみ存在します。したがって、使用と宣言の背後にあるロジックを変更する必要がありますreturnString[]

于 2013-08-18T21:35:29.257 に答える
0

基本的に、NOT malloc'ed のストレージは、ルーチンの終了後も存続しません。グローバル変数を使用できる場合もありますが、単純なタスク、つまり 2 つの文字列を連結する作業が複雑になります。

char * string_add(char * base, char * toAdd)
{
    char *string_ptr = malloc(strlen(base)+streln(toAdd)+1);

    sprintf(string_ptr, "%s%s", base, toAdd);

    // string_ptr points to heap storage that is permanent
    return string_ptr;
}

// in main() ....

char *s1 = string_add("A", "B");
// s1 points to storage on the heap as: "AB\0"
//
free(s1);  // OR allow system to clean-up when main() exits
于 2013-08-18T21:36:15.993 に答える
0

関数の 2 回目の呼び出しで、最初の呼び出しで作成されたバッファーの内容が上書きされると思います。

私の理解では、2 つの文字列を連結しようとしています。

この回答を見てください。

基本的に、文字列の長さはコンパイル時にわからないため、動的メモリを割り当てる必要がありfreeますが、新しいstring.

于 2013-08-18T21:28:16.653 に答える