在编写了一个反转字符串的程序后,我无法理解为什么在尝试反转字符串时会出现段错误。我在下面列出了我的程序。
#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 ( calloc(1,'\0')
) 分配了 1 个字节的内存,并且我将一个 18 字节的字符串复制mystring0123456789
到其中,它也没有抛出任何错误,并且程序在没有任何 SEGFAULT 的情况下运行良好。
为什么我的程序没有抛出错误?理想情况下,它应该抛出一些错误,因为它没有任何内存来存储那个大字符串。有人可以解释一下吗?
该程序运行完美,并给了我输出Reverse String is: 9876543210gnirtsym
。
第二个问题:
如果替换语句
strcpy(str,"mystring0123456789");
和
str="mystring0123456789\0";
即使我为 str ( malloc(100)
) 分配了足够的内存,程序也会出现分段错误。
为什么程序抛出分段错误?