文字列を逆にするプログラムを書いた後、文字列を逆にしようとしたときにセグメンテーション違反が発生した理由を理解するのに苦労しています。私のプログラムを以下にリストしました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse(char *);
int main() {
char *str = calloc(1,'\0');
strcpy(str,"mystring0123456789");
reverse(str);
printf("Reverse String is: %s\n",str);
return 0;
}
void reverse(char *string) {
char ch, *start, *end;
int c=0;
int length = strlen(string);
start = string;
end = string;
while (c < length-1){
end++;
c++;
}
c=0;
while(c < length/2){
ch = *end;
*end = *start;
*start = ch;
start++;
end--;
c++;
}
}
最初の質問:
charポインタstr()に1バイトのメモリしか割り当てておらずcalloc(1,'\0')
、18バイトの文字列をコピーしmystring0123456789
たにもかかわらず、エラーはスローされず、プログラムはSEGFAULTなしで正常に動作しました。
プログラムがエラーをスローしなかったのはなぜですか?理想的には、その大きな文字列を格納するためのメモリがないため、エラーがスローされるはずです。誰かがこれに光を当てることができますか?
プログラムは完全に実行され、出力が表示されますReverse String is: 9876543210gnirtsym
。
2番目の質問:
ステートメントを置き換える場合
strcpy(str,"mystring0123456789");
と
str="mystring0123456789\0";
str()に十分なメモリを割り当てても、プログラムでセグメンテーション違反が発生しますmalloc(100)
。
プログラムがセグメンテーション違反をスローするのはなぜですか?