2017-02-25 6 views
-4

私は初心者と私の英語はあまりよく申し訳ないです。私は、文字列と数値を取得し、文字列 'number'のステップですべての文字を移動する関数を記述しました。私はそれをデバッグしようとし、それは動作を停止します。誰もが問題を知っていますか?ここchar arr = "..."; Cプログラムでは、クラッシュする

は私のコードです:ここ

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

void moveString(char* str, int _switch); 

void main() 
{ 
    char arr = "abcdef"; 
    moveString(arr, 2); 
    printf("%s", arr); 
} 

void moveString(char* str, int _switch) 
{ 
    int len = strlen(str) + 1, i = 0, j = 0, move = len - _switch + 1; 
    char* temp = (char*)malloc(sizeof(char)*len); 
    if (!temp) 
     return NULL; 
    for (i = 0;i < move;i++) 
     temp[i+_switch] = str[i]; 
    for (j = 0;j < _switch;j++) 
     temp[j] = str[len - _switch + j + 1]; 
    str = temp; 
} 

は誤りです:

Exception thrown at 0x0FCA1FD0 (ucrtbased char arr = ".dll) in ConsoleApplication3.exe: 0xC0000005: Access violation reading location 0x00000030."

+1

これはコンパイルしないでください。あなたは 'void'を返すと宣言された関数に' return NULL'を返します。 – melpomene

+1

あなたは 'temp [i + _switch]'に書き込みます。 'i'の値は最大で' move-1'です。 'move'は' len - _switch + 1'なので、 'i'の最大値は' len - _switch'です。したがって、 'i + _switch'の最大値は' len'です。 'temp'は' len'バイトの長さなので、インデックス 'len'は範囲外です(有効なインデックスは' 0' .. 'len-1'です)。 – melpomene

+1

'str'は' moveString'のローカル変数です。 'str = temp'という代入は無駄です。' str'がなくなる前に関数内の最後のステートメントなので、誰も割り当てられた値を見ることはありません。 – melpomene

答えて

1

あなたがコンパイラの警告に注意を払うと、それらのすべて排除しなければなりません。彼らは理由のために存在します。

あなたのコードをコンパイルすると、あなたのクラッシュの原因であるおそらくwarning: initialization makes integer from pointer without a cast [-Wint-conversion] char arr = "abcdef";が得られます。

Cで"abcdef"abcdefが書き込まれるメモリの領域へポインタあるので、char *arr = "abcdef"なければなりません。

しかし、これはあなたのプログラムで唯一の問題ではありません。真剣に、コンパイラのメッセージを見て、警告が何であるかを理解し、コードを生成しないように修正してください。

+0

これは、一般的なアドバイスでのコメント集ですが、答えはありません。 – Olaf

+0

@Olafこれが答えです。慎重に読む。前述のように、 'char arr'を' char * arr'に変更すると、クラッシュが解消されます。 – avysk

+0

ありがとう@avysk! – Jovani

関連する問題