C 使用字符指针->分段错误

C 使用字符指针->分段错误,c,pointers,char,segmentation-fault,fault,C,Pointers,Char,Segmentation Fault,Fault,我是一个初学者,在学校我们的任务是使用指针拆分字符数组。我要拆分名称和生日分隔符=''。我的解决方案非常适合这个名字,但是在生日那天使用它,我会遇到一个分割错误 int main(int argc, char *argv[]) { char *fullname; char *name; char *lastname; char *birthday; char *day; fullname = argv[1]; birthday = argv

我是一个初学者,在学校我们的任务是使用指针拆分字符数组。我要拆分名称和生日分隔符=''。我的解决方案非常适合这个名字,但是在生日那天使用它,我会遇到一个分割错误

int main(int argc, char *argv[])
{
    char *fullname;
    char *name;
    char *lastname;
    char *birthday;
    char *day;
    fullname = argv[1];
    birthday = argv[2];
    int i = 0;
    int y = 0;
    int z = 0;

    while(fullname[i] != '.'){
        char x = fullname[i];
        name[i] = x;
        fullname[i] = ' ';
        i++;
    }
    i++;

    while(fullname[i] != '\0'){
        char x = fullname[i];
        lastname[y] = x;
        fullname[i] = ' ';
        i++;
        y++;
     }

    while(birthday[z] != '.'){
         char b = birthday[z];  
         day[z] = b;
         z++;
    }
}
命令行中的输入。/a是cygwin上的exe文件:

./a mister.gold 11.05.2005
输出:

segmentation fault
当我在没有最后一个循环的情况下启动代码时,我的输出是:

mister
gold
两个字符数组指针,但它们指向什么?没什么,所以你基本上是在尝试访问一个你不拥有的内存 要为它们分配内存,应执行以下操作:

 // assuming the maximum size if 512 for example or you can give it any size you think is enough
 char *name =malloc(512);
 char *lastname=malloc(512);
现在,它们指向您可以访问和修改的内容

在使用完它们之后,应该像这样释放动态分配的内存

free(lastname); 
free(name); 

name、lastname和friends未初始化为指向任何有效内存。您不能使用未初始化的char*指针。@EugeneSh。谢谢你的回复,但是为什么当我删除最后一个循环时它会工作呢?它不会。这是未定义的行为。您应该检查argc==3,如果不是,例如,打印一个错误并返回stdlib.h中定义的EXIT_FAILURE,或者通常为非零。此外,您还可以检查是否未遇到“.”和“\0”。看,非常感谢。你甚至可以通过在argv[1]中为spot指定name和lastname来实现,但它们需要被指定在可写的地方。
free(lastname); 
free(name);