2016-03-28 12 views
-3

私はプログラムを書いた*文字を設定するように見えることはできません:私は「C」私を与えることを期待するは正しく

int main() { 
    char* test = malloc(5); 
    *test = "testc"; 
    printf("Test=%c",test[4]); 
} 

を、それは最高の状態で私に何を与えていない、とセグメンテーションフォールトで最悪。私はおそらく何が間違っているのですか?別の変数を作成してstrncpy()を作成する必要がありますか?私も試しました:

int main() { 
    char* test = malloc(5); 
    char* test2 = "test" 
    strncpy(test,test2,4); 
} 

正常に動作しますが、まあまあです。私はここで何か間違っていますか?あなたのケースでは

+1

これを書くことができてもコンパイルされていないはずされ、あるいは少なくともそれはあなたに警告を与えているはずです。警告を無視しない*修正*してください。特に質問を投稿する前に。 –

+0

'strncpy'を間違って使いました。その関数の使用を避けることは良いことです。エラーが発生しやすく、コードにバグが入るのを避けるために、そのドキュメントを慎重に読む必要があります。 strncpyよりも常に良い方法があります。 –

答えて

1

*test = "testc"; 

は非常に間違っています。変数charにポインタを入れようとしています。あなたのコンパイラで警告を有効にすると、それは悲鳴を上げるでしょう。

何をすべきことは、いずれか

  • はないmalloc関数を実行し、直接ポインタに文字列リテラルを割り当てています。
  • malloc()、次にstrcpy()を文字列リテラルをポインタの指すメモリに使用します。
  • malloc()を入力しないでください。strcpy()を使用しないでください。strdup()を使用し、結果をポインタに格納してください。

キャッチ(ES)は(ある)

  • 最初のケースで、文字列リテラルは、非変更であろう。
  • 後で2つの場合、割り当てられたメモリはfree()にする必要があります。
  • 厳密に言えば最後の方法は、の非標準です。
+0

Aaah、ありがとう、どうもありがとう。 – Roguebantha

1
このプログラムで

int main() { 
    char* test = malloc(5); 
    *test = "testc"; 
    printf("Test=%c",test[4]); 
} 

あなたは、割り当てられたメモリへのポインタtestポイントを結果としてメモリ

char* test = malloc(5); 

を割り当てられました。

あなたは間違った構文を使用しかしprointer

*test = "testc"; 

をreasignしようとしました。

*testcharを入力し、この声明の中で、あなたがメモリの最初の文字が文字列リテラルのアドレスをtestで指さ割り当てることを試みています。

しかし、あなたは

test = "testc"; 

として正しく表現を書いた場合は、割り当てられたメモリのアドレスが、この場合には失われ、メモリが自由にできないため、メモリリークがありました。

また、ポインターが文字列を指し示す必要がある場合は、終了ゼロを提供するために6文字を割り当てる必要があります。割り当てられたメモリにも格納されます。あなたが必要なもの

は、次の

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char *test = malloc(6); 

    strcpy(test, "testc"); 
    printf("Test=%c\n",test[4]); 

    free(test); 
} 

またはあなただけの

#include <stdio.h> 

int main(void) 
{ 
    char *test = "testc"; 

    printf("Test=%c\n",test[4]); 
}