2011-12-29 8 views
0

はコードです:Cで文字列の1つの配列を作成できないのはなぜですか?私はここではCの文字列のいずれかの配列を作成しようとしました

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

int main() 
{ 
    char *foo[100]; 
    strcpy(foo[0], "Testing this"); 
    printf("%s ", foo[0]); 

    return 1; 
} 

しかし、私はそれをコンパイルするとき、それは単に壊れます。エラーも、何もない、それは単に機能しないし、壊れます。なにか提案を?私がtri char * foo [10]を実行すると動作しますが、10個の文字列では動作しません

答えて

4

ポインタの配列を割り当てましたが、ポインターの配列を割り当てました。ヒープからメモリを割り当てるには、mallocに電話する必要があります。

char *foo[100]; 
foo[0] = malloc(13); 
strcpy(foo[0], "Testing this"); 

当然、あなたがそれを終えたとき、いくつかの後日メモリをfreeする必要があります。

コードでは、undefined behaviorが呼び出されます。基本的には、あなたが意図したコードを含め、何かが起こる可能性があります。 char *foo[10]のバージョンが意図したとおりに動作していれば、運が悪いだけです。

脇に、main()の定義が間違っています。 int main(void)である必要があります。

+0

さらにもう1つ、なぜこれも失敗するのでしょうか? – FinalDestiny

+0

ありがとうございます:) – FinalDestiny

1

割り当てられていないポインタを割り当てています。 char * foo [100]は100個の未割り当てポインタの配列で、メモリ内の未知の場所、おそらくアクセスできない場所を指します。

0

他の人の回答をすると拡大:

char *foo; 

が文字へのポインタです。それは、単一の文字のアドレスが割り当てられるか、 '\ 0'で終わる文字シーケンスの最初のアドレスが割り当てられます。また、malloc()を介してアドレスを割り当てることもできます。

char foo[100]; 

は、最大99文字の文字列と終端の '\ 0'文字のための100文字またはスペースのスペースです。

char *foo[100]; 

は100文字のポインタ、つまり100 char *foo;です。

1

ここで、どこにポインタを置かないように100個のポインタを作成しています。 Davidが説明したように、メモリを動的に割り当てる必要があります。しかし、あなたはまた、あなたが文字列(または最大)の大きさを知っていれば、コンパイラはあなたのためにこれを行うことができます。

// Create an array of 10 strings of size 100 and initialize them automatically 
char foo[10][100] = {0}; 

// Now you can use it them and not worry about memory leaks 
strcpy(foo[0], "text"); 

// Or use the safer version 
strcpy_s(foo[0], 100, "text"); 
0
#include <stdlib.h> 
#include <stdio.h> 

int main(void){ 
    char *foo[100]; 
    foo[0] = malloc(13*(sizeof(char))); 
    strcpy(foo[0], "Testing this"); 
    printf("%s ", foo[0]); 

    return 0; 
} 

これはあなたのコードの修正版です。

MISTAKE: not allocating enough memory for the string. 

CORRECTION: using malloc to allocate 13 blocks of memory for the string. 
関連する問題