2016-11-09 5 views
0

char配列を使用するLinux VMでCプログラムを作成しようとしています。私は配列に何かをしようとするたびに、私はそれが見つかりました。 sizeof()、セグメンテーション違反が発生しました。私はちょうど配列を作ってテストとしてsizeof()を得たテストプログラムを書いたが、確かに私は同じエラーを得る。 これはVMで動作するプログラムに関連していると思います。ここにコードです:Cali Linux VM内のセグメンテーションフォールト

#include <stdio.h> 
#include <stdlib.h> 
#define ARR_LENGTH(x) sizeof(x)/sizeof(x[0]) 

int main() 
{ 
    printf("Hllo world!\n"); 
    int sent = 10; 
    char hello[] = {'a','b','c','d','e','f','g','h'}; 
    printf(sizeof(hello)); 
    printf(ARR_LENGTH(hello)); 
    return 0; 
} 

私は何かが不足している、またはVMは問題がありますか?

+2

'printf(sizeof(hello));'は数字の印字方法ではありません。 'printf'はその数値を' char * 'として使用します。これは、おそらくセグメンテーション違反の原因になります。私はあなたのコンパイラがあなたにそれについて警告していないことに驚いています。 – Biffen

+0

...いいえ、これはVMで動作することとは関係ありません。 (あなたがその結論にどのように到達したかについてはかなり興味があります。) – Biffen

+1

標準機能を使用する前に、またはOSを疑うように、マニュアルページを読むことをお勧めします。そして、VMはアプリケーションコードにまったく影響を与えません。それを使って基本的な考え方です。 – Olaf

答えて

3

printf()のマニュアルをよく読んでください。最初の引数として整数をとらない。

問題の行は、次のとおり

printf(sizeof(hello)); 
printf(ARR_LENGTH(hello)); 

それがあるべき:

printf("%zu\n", sizeof(hello)); 
printf("%zu\n", ARR_LENGTH(hello)); 

%zusize_t値を出力するためのフォーマット指定です)。これらの二つの文は 'のprintf' の引数1を渡すと、キャストなしで整数 からポインタを作る[-Wint-変換]

警告:

私のGCCコンパイラは警告を生成します。コンパイラの警告レベルを上げます(あなたがalrreadyを取得しない場合)。

+0

これは私が持っている元のコードを修正するものではありませんが、この問題のコードを修正して受け入れます。どんなレートでも知っておくと便利です:)ありがとう! – dodo

関連する問題