私は初心者と私の英語はあまりよく申し訳ないです。私は、文字列と数値を取得し、文字列 '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."
これはコンパイルしないでください。あなたは 'void'を返すと宣言された関数に' return NULL'を返します。 – melpomene
あなたは 'temp [i + _switch]'に書き込みます。 'i'の値は最大で' move-1'です。 'move'は' len - _switch + 1'なので、 'i'の最大値は' len - _switch'です。したがって、 'i + _switch'の最大値は' len'です。 'temp'は' len'バイトの長さなので、インデックス 'len'は範囲外です(有効なインデックスは' 0' .. 'len-1'です)。 – melpomene
'str'は' moveString'のローカル変数です。 'str = temp'という代入は無駄です。' str'がなくなる前に関数内の最後のステートメントなので、誰も割り当てられた値を見ることはありません。 – melpomene