2012-03-12 8 views
2

私はメタC言語から、Cで始まるよ、基本的な、短い時間警告:PHPとHTMLの割り当ては、キャストせずにポインタから整数を作る、セグメンテーションフォールト

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

compare(const void * a, const void * b){ 
    return (*(int*)a - *(int*)b); 
} 

int main(){ 

    int arr_size = 10; 

    int j; 

    char array[arr_size][2]; 
    char str[50]; 
    char output[50]; 

    // fill the array with string and random integers 
    for (j=0; j<arr_size; j++) { 
     strcpy(str, "array"); 
     array[j][0] = str;  //i've should put *str 
     array[j][1] = rand() % arr_size+1; 
    } 

    // print the array 
    for (j=0; j<arr_size; j++) { 
     strcpy(str, ""); 
     strcpy(output, ""); 
     sprintf(str, "%u", array[j][0]); // %u should be %s but return me segmentation fault 
     strcat(output, str); 
     strcat(output, " "); 
     sprintf(str, "%i", array[j][1]); 

     strcat(output, str); 
     printf(output); printf("\n"); 
    } 

    printf("\n"); 

} 

これは完全なコードです、

array[j][0] = str; 

sprintf(str, "%u", array[j][0]); 

を見て、私は前*を配置する必要があります警告メッセージを渡すが、私はポインタを宣言していない。なぜこのソリューションですか?

%u%sに変更すると、私はセグメント違反を返します。何が問題なのですか?

+2

をCについての良いプログラミングの本を読んで数分で説明するCであるため、(あなたは、フォーラムでより良い説明を取得します不可能)、デバッガを使用する方法を学びます。 –

+0

私はいくつかの参考資料を提案できますか?実際に私はgeanyを使っています:-) – DreamIt

+1

@ sataranjasvami、http://stackoverflow.com/tags/c/info –

答えて

0

array[j][0]は、charです。その配列にcharを割り当てることはできません。 *strは単にstrの最初の文字なので、この割り当ては有効です。

同じ理由から、%sで印刷することはできません。この指定子は、1文字ではなくヌル終了文字列を印刷するために使用されます。

それはNUL終端ではありませんので、あなたはまた、sprintf(str, "%s", array[j]);を行うことはできません/

+0

"charの配列を割り当てることはできません"、ok。 %cを使用して結果を確認しました。問題をどのように解決する必要がありますか?私は文字列の二次元配列が必要です。 – DreamIt

+0

'char'のヌルで終わる配列へのポインタを文字列として考えるかもしれません。あなたは 'strdup'を使ってそれらを作成することができます。ところで、文字列の二次元配列は、C++では 'std :: vector 'のように簡単になりますので、C++を使う方が簡単です。 –

+0

C++は文字列で終わっているようです – DreamIt

関連する問題